python Flask:mod_wsgi中.env和. flakenv的应用程序配置设置

qnakjoqk  于 2023-02-15  发布在  Python
关注(0)|答案(3)|浏览(161)

我已经花了相当长的时间试图弄清楚如何设置.env和. flakkenv配置值在我的flask后端在谷歌云平台服务器。我使用apache 2,mod_wsgi,Flask,Python 3.6和SQLAlchemy。我的后端工作良好,在我的Mac本地使用纯Flask。
安装了python-dotenv之后,运行flask命令将设置.env和. flakenv文件中定义的环境变量,但是这对wsgi不起作用,来自apache的请求被重定向以执行我的run.wsgi-file,没有机制(据我所知)可以设置.env和. flakenv文件中定义的环境变量。
最低要求是传递给应用程序的信息,如果测试或开发环境应该使用。从那里我可以在init.py填充app.config值从一个对象。然而,不知何故,能够使用配置值从.env和. flakenv会好得多。我真的很感激,如果有人有任何好主意在这里-最好的做法,以设置app.config值在wsgi环境。
有两个帖子提出了同样的问题-他们真的没有一个最佳实践如何应对这个挑战(我相信我不是唯一一个有困难的时间与此):
Why can't Flask can't see my environment variables from Apache (mod_wsgi)?
Apache SetEnv not working as expected with mod_wsgi
我的跑步。

import sys
sys.path.append("/var/www/contacts-api/venv/lib/python3.6/site-packages")
sys.path.insert(0,"/var/www/contacts-api/")
from contacts import create_app
app = create_app('settings.py')
app.run()

[3]:允许您使用预设方法配置应用程序。

from flask_appconfig import AppConfig
def create_app(configfile=None):
app = Flask('myapp')
AppConfig(app, configfile)
return app

create_app返回的应用程序将按顺序:
从名为myapp.default_config的模块(如果存在)加载默认设置。(www.example.com中介绍的方法http://flask.pocoo.org/docs/config/#configuring-from-files)从环境变量MYAPP_CONFIG中指定名称的配置文件加载设置(参见1.中的链接)。直接从前缀为MYAPP_的环境变量加载json或字符串值,例如,设置MYAPP_SQLALCHEMY_ECHO=true将导致SQLALCHEMY_ECHO的设置为True。通过将适当的选项传递给构造函数或init_app(),可以更改或禁用任何这些行为。
[4]:使用“ENV-only”如果您只想使用Flask-AppConfig的环境解析函数,则会显示相应的函数:

from flask_appconfig.heroku import from_heroku_envvars
from flask_appconfig.env import from_envvars
# from environment variables. note that you need to set the prefix, as
# no auto-detection can be done without an app object
from_envvars(app.config, prefix=app.name.upper() + '_')
# also possible: parse heroku configuration values
# any dict-like object will do as the first parameter
from_heroku_envvars(app.config)
0sgqnhkj

0sgqnhkj1#

在阅读了更多关于这方面的内容并尝试了许多不同的方法后,我得出了一个结论:使用.env和. flakenv文件配置Flask应用程序是没有合理的方法的。我最终使用了Configuration Handling中提供的一个方法,该方法可以以合理的方式管理开发/测试/生产环境:

app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('YOURAPPLICATION_SETTINGS')

我的run.wsgi(正在谷歌云平台计算示例中使用):

import sys
import os
from contacts import create_app
sys.path.append("/var/www/myapp/venv/lib/python3.6/site-packages")
sys.path.insert(0,"/var/www/myapp/")
os.environ['SETTINGS_PLATFORM_SPECIFIC'] = "/path/settings_platform_specific.py"
os.environ['CONFIG_ENVIRONMENT'] = 'DevelopmentConfig'

app = create_app(')
app.run()

在我的Mac上,我使用run.py(用于flask运行):

import os
from contacts import create_app
os.environ['SETTINGS_PLATFORM_SPECIFIC'] ="/path/settings_platform_specific.py"
os.environ['CONFIG_ENVIRONMENT'] = 'DevelopmentConfig'

if __name__ == '__main__':
    app = create_app()
    app.run()

用于应用程序创建init.py

def create_app():

    app = Flask(__name__, template_folder='templates')
    app.config.from_object(f'contacts.settings_common.{os.environ.get("CONFIG_ENVIRONMENT")}')
    app.config.from_envvar('SETTINGS_PLATFORM_SPECIFIC')

    db.init_app(app)
    babel.init_app(app)
    mail.init_app(app)
    bcrypt.init_app(app)
    app.register_blueprint(routes)
    create_db(app)

    return app

在这一点上,看起来这对我的目的来说很好,最重要的是我可以很容易地管理不同的环境,并使用git将后端服务部署到google平台。

q5lcpyga

q5lcpyga2#

我也遇到了同样的难题,我想在使用flask run进行开发时,使用与docker-compose相同的.env文件,最终我使用了python-dotenv,如下所示:
.env中:

DEBUG=True
APPLICATION_ROOT=${PWD}

config.py中:

import os

from dotenv import load_dotenv
load_dotenv()

class Config(object):
    SECRET_KEY = os.getenv('SECRET_KEY') or 'development-secret'
    DEBUG = os.getenv("DEBUG") or False
    APPLICATION_ROOT = os.getenv("APPLICATION_ROOT") or os.getcwd()

我还没有尝试过它,但是我也可以结合这个解决方案来尝试一下flask-env

mwyxok5s

mwyxok5s3#

最简单的方法是使用load_dotenv()和from_mapping

from flask import Flask
from dotenv import load_dotenv , dotenv_values

load_dotenv()

app = Flask(__name__)
config = dotenv_values()
app.config.from_mapping(config)

相关问题