我为我的应用设置了一个新的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
答案 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__'
。