簡體   English   中英

部署應用程序時無法從實例文件夾加載配置文件

[英]Unable to load configuration file from instance folder when deploying app

我為我的應用程序設置了一個新的virtualenv,以清理已安裝的軟件包。 我在app的實例文件夾中有一個config.py文件。 有兩個配置,一個用於'instance'文件夾中的dev,另一個用於根文件夾中的production。 該應用程序在舊的環境中工作,但現在我收到一個錯誤,它無法找到配置文件。 為什么我會收到此錯誤,如何解決?

Traceback (most recent call last):
  File "application.py", line 12, in <module>
    application.config.from_pyfile('config.py')
  File "/Users/pavsidhu/Envs/test/lib/python2.7/site-packages/flask/config.py", line 128, in from_pyfile
    with open(filename) as config_file:
IOError: [Errno 2] Unable to load configuration file (No such file or directory): '/Users/pavsidhu/Envs/test/var/application-instance/config.py'

我的項目結構如下:

/Users/pavsidhu/Envs/test/
    lib/python-3.4/site-packages/
    bin/
    application.py
    static/
    templates/
    instance/
        config.py

Flask認為您的應用程序已安裝在env中,因為您將其放在與env相同的基本目錄中。 此行為在文檔中有詳細描述。

已安裝的模塊或包裝:

 $PREFIX/lib/python2.X/site-packages/myapp $PREFIX/var/myapp-instance 

$ PREFIX是Python安裝的前綴。

當以這種方式安裝時,Flask希望實例文件夾位於var/myapp-instance (結構不完全相同,但它足以愚弄Flask的檢測功能 。)

您不應該將項目結構與virtualenv結構混合在一起。 將兩者分開:

my_env/
    lib/
    bin/
my_project/
    my_app/
        __init__.py
        static/
        templates/
    instance/

有關詳細信息,請參閱移至聊天的評論討論。

“最佳實踐”是將默認配置作為模塊嵌入/分發到應用程序內部。 然后根據環境變量從文件加載配置覆蓋值。 Flask配置處理文檔中對此進行了描述。 我會遵循最佳實踐,而不是依賴目錄名來分隔它們。 我過去所做的就像下面的app.py

import flask

class Application(flask.Flask):
    def __init__(self, name):
        super(Application, self).__init__(name)
        self.config.from_object('mypackage.config')
        self.config.from_envvar('APP_CONFIG', silent=True)

    def run(self, *args, **kwargs):
        kwargs.setdefault('host', self.config['HOST'])
        kwargs.setdefault('port', self.config['PORT'])
        kwargs.setdefault('debug', self.config['DEBUG'])
        return super(Application, self).run(*args, **kwargs)


app = Application(__name__)

@app.route('/')
def root_handler():
    return 'Hi there'

config.py模塊很簡單:

import os

DEBUG = False
TESTING = False
PORT = int(os.environ.get('PORT', '8000'))
HOST = os.environ.get('HOST', '127.0.0.1')
SECRET_KEY = os.urandom(24)

默認情況下,我將環境變量用於許多可配置值,因為應用程序托管提供(例如,heroku)和命令行工具(例如, honcho )將它們設置為有用的值。

我遇到了類似的問題並修改了我當前的工作目錄,使其與項目目錄相同。

Debbuging,我發現由於某種原因,當Flask()。import_name屬性是一個名為'__name__'的字符串時, instance_path = os.getcwd() + /instance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM