部署应用

时间:2015-07-01 14:25:26

标签: python flask

我为我的应用设置了一个新的virtualenv,以清理已安装的软件包。我在应用的实例文件夹中有一个config.py文件。有两个配置,一个用于开发实例'文件夹和根文件夹中的生产文件夹。该应用程序在旧的环境中工作,但现在我收到一个错误,它无法找到配置文件。为什么我会收到此错误以及如何解决?

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

3 个答案:

答案 0 :(得分:6)

Flask认为您的应用已安装在env中,因为您将其放在与env相同的基本目录中。详细描述了此行为in the docs

  

已安装的模块或包:

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

$ PREFIX是Python安装的前缀。

当以这种方式安装时,Flask希望实例文件夹位于var/myapp-instance。 (结构并不完全相同,但它足以愚弄Flask的detection function。)

您不应将项目结构与virtualenv结构混合使用。将两者分开:

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

See the comment discussion moved to chat for further details.

答案 1 :(得分:1)

&#34;最佳实践&#34;是将您的默认配置嵌入/分发为应用程序内的模块。然后根据环境变量从文件加载配置覆盖值。这被描述为in the Flask Configuration Handling documentation。我会遵循最佳实践,而不是依赖目录名来分隔它们。我过去所做的就像下面的 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)将它们设置为有用的值。

答案 2 :(得分:1)

我遇到了类似的问题并修改了将当前工作目录更改为等于项目目录。

Debbuging,我发现由于某种原因,当Flask()。import_name属性是一个名为instance_path = os.getcwd() + /instance的字符串时,'__name__'