TL; DR
我不想每次登录时export
变量。我希望它们在我的配置中。
来自文档
建议使用如上所述的环境变量。虽然可以在配置或代码中设置ENV和DEBUG,但强烈建议不要这样做。
我该怎么办?怎么可能?
更多-我尝试过的事情
我有一个flask.cfg
和一个FLASK_ENV='development'
。我运行flask run
,并打印出development
。但是生产服务器已经启动。 它忽略以下内容:
app.config.from_pyfile("flask.cfg")
print(f"{app.config['ENV']}") => development
这是一个无关紧要的个人项目。因此,为了方便起见,我忽略了最佳做法。
答案 0 :(得分:3)
2020年3月更新:
根据Flask devs,您不能再这样做:
ENV和DEBUG配置值很特殊,因为它们可能会表现 在应用程序开始设置后,如果更改不一致,则不一致。为了 为了可靠地设置环境和调试模式,Flask使用环境 变量。
该环境用于指示Flask,扩展名和其他 程序(例如Sentry)在Flask中运行的上下文。它是 由FLASK_ENV环境变量控制,默认为 生产。
将FLASK_ENV设置为开发将启用调试模式。烧瓶运行 默认将在调试中使用交互式调试器和重新加载器 模式。要与环境分开控制,请使用 FLASK_DEBUG标志。
将Flask切换到开发环境并启用 调试模式,设置FLASK_ENV:
> $ export FLASK_ENV=development
> $ flask run (On Windows, use set instead of export.)
建议使用如上所述的环境变量。 虽然可以在配置或代码中设置ENV和DEBUG,但这 强烈建议不要这样做。烧瓶无法尽早读取它们 命令,并且某些系统或扩展名可能已经配置 本身基于先前的值。
答案 1 :(得分:2)
这有什么用:安装 python-dotenv 软件包,在项目根文件夹中创建一个.flaskenv文件,然后添加以下内容:
FLASK_APP=app.py (or whatever you named it)
FLASK_ENV=development (or production)
保存。做烧瓶运行。
答案 2 :(得分:1)
WINDOWS
我不知道为什么我的修复程序起作用,但是成功了。看起来Powershell只关心一行,因此它会忽略您在“烧瓶运行”之前键入的所有内容 所以我创建了只说
的批处理文件@echo off
set FLASK_ENV=development
set FLASK_APP=run.py
flask run
它像以前一样工作。
因此在Linux中,您可能需要更改终端或为此创建快捷方式。也许会解决。我不确定,虽然。但是对于Windows来说就可以了
答案 3 :(得分:0)
您的项目结构如下所示:
dad_site /
| -app /
.. |-__init__
。py
.. | -flask.cfg
| -run.py
您的应用程序/__init__
.py文件:
from flask import Flask
app = Flask(__name__)
app.config.from_pyfile('flask.cfg', silent=True)
@app.route('/')
def home():
return 'Hello World'
/app/flask.cfg配置文件:
TESTING=False
DEBUG=True
run.py文件:
from app import app
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000)
您还可以定义一个实例文件夹,并将您的配置文件放在其中。因此您的应用程序结构如下所示:
dad_site /
| -app /
.. |-__init__
。py
.. | -instance /
.... | -flask.cfg
| -run.py
还有您的__init__
。py文件:
from flask import Flask
import os
def get_app_base_path():
return os.path.dirname(os.path.realpath(__file__))
def get_instance_folder_path():
return os.path.join(get_app_base_path(),
'instance')
app = Flask(__name__,
instance_path=get_instance_folder_path(),
instance_relative_config=True)
app.config.from_pyfile('flask.cfg', silent=True)
@app.route('/')
def home():
return 'Hello World'
答案 4 :(得分:0)
如果将配置移入Python,事情会变得容易一些。考虑
from flask import Flask
from config import Config
app = Flask(__name__)
app.config.from_object(Config)
config.py
的外观
import os
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY', 'default sekret')
这为您提供了可以被环境变量覆盖的默认值。
答案 5 :(得分:0)
尽管可能不建议这样做,但是您可以创建一个custom script并将其设置在那里。
manage.py
#!/usr/bin/env python
from os import path as environ
import click
from flask import Flask
from flask.cli import FlaskGroup
def create_app():
app = Flask(__name__)
...
return app
@click.group(cls=FlaskGroup, create_app=create_app)
@click.option('-e', '--env', default="development")
def manager(env):
environ["FLASK_ENV"] = env
if __name__ == "__main__":
manager()
现在在命令行中(运行pip install manage.py
后)可以执行manage run
或manage -e production run
。
与app factory pattern结合使用,您还可以动态更改配置。