python - Correct way to use Flask configuration from_object
问题描述
I'm trying to use debug mode in Flask, but it's crashing every time. Ny config.py file looks like this:
class Config(object):
DEBUG = False
DEVELOPMENT = False
SECRET_KEY = 'do-i-really-need-this'
FLASK_SECRET = SECRET_KEY
SQLALCHEMY_DATABASE_URI = 'host'
class DevConfig(Config):
DEVELOPMENT = True
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'host2'
Then, init.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
"""Construct the core application."""
app = Flask(__name__, instance_relative_config=False)
app.config.from_object('config.DevConfig')
db.init_app(app)
with app.app_context():
# Imports
from . import routes
# Create tables for our models
db.create_all()
return app
And finally, the run file:
from application import create_app
app = create_app()
if __name__ == "__main__":
app.run(host='0.0.0.0')
When I try to run it, following error appears:
* Serving Flask app "application" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
INFO:werkzeug: * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
INFO:werkzeug: * Restarting with stat
Traceback (most recent call last):
File "<ipython-input-1-aaa9539d5209>", line 1, in <module>
runfile('/home/vladimir.balayan/Desktop/scipts/UX/flasksqlalchemy-tutorial-master/wsgi.py', wdir='/home/vladimir.balayan/Desktop/scipts/UX/flasksqlalchemy-tutorial-master')
File "/home/vladimir.balayan/anaconda3/envs/wbe-testing/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "/home/vladimir.balayan/anaconda3/envs/wbe-testing/lib/python3.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "/home/vladimir.balayan/Desktop/scipts/UX/flasksqlalchemy-tutorial-master/wsgi.py", line 11, in <module>
app.run(host='0.0.0.0')
File "/home/vladimir.balayan/anaconda3/envs/wbe-testing/lib/python3.7/site-packages/flask/app.py", line 990, in run
run_simple(host, port, self, **options)
File "/home/vladimir.balayan/anaconda3/envs/wbe-testing/lib/python3.7/site-packages/werkzeug/serving.py", line 1007, in run_simple
run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
File "/home/vladimir.balayan/anaconda3/envs/wbe-testing/lib/python3.7/site-packages/werkzeug/_reloader.py", line 332, in run_with_reloader
sys.exit(reloader.restart_with_reloader())
File "/home/vladimir.balayan/anaconda3/envs/wbe-testing/lib/python3.7/site-packages/werkzeug/_reloader.py", line 159, in restart_with_reloader
args = _get_args_for_reloading()
File "/home/vladimir.balayan/anaconda3/envs/wbe-testing/lib/python3.7/site-packages/werkzeug/_reloader.py", line 76, in _get_args_for_reloading
if __main__.__package__ is None:
AttributeError: module '__main__' has no attribute '__package__'
I already installed python-dotenv
module and made .env
file with FLASK_ENV=development
, but the error is the same.
I'm using Spyder IDE for debugging and this tutorial
解决方案
如果您的应用程序结构与您所遵循的教程中所示的相同,请尝试将您的更改config.py
为
from os import environ, path
basedir = path.abspath(path.dirname(__file__))
class Config(object):
DEBUG = False
DEVELOPMENT = False
SECRET_KEY = environ.get('SECRET_KEY') or \
'\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'
FLASK_SECRET = SECRET_KEY
class DevConfig(Config):
DEVELOPMENT = True
DEBUG = True
SQLALCHEMY_DATABASE_URI = environ.get('SQLALCHEMY_DATABASE_URI') or \
'sqlite:///' + os.path.join(basedir, 'db.sqlite')
class ProdConfig(Config):
DEVELOPMENT = True
DEBUG = True
SQLALCHEMY_DATABASE_URI = environ.get('SQLALCHEMY_DATABASE_URI') or \
'sqlite:///' + os.path.join(basedir, 'db.sqlite')
config = {
'dev': DevConfig,
'prod': ProdConfig,
'default': DevConfig,
}
然后你__init__.py
到这个
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import config
db = SQLAlchemy()
def create_app(config_name):
"""Construct the core application."""
app = Flask(__name__)
app.config.from_object(config.get(config_name or 'default'))
db.init_app(app)
with app.app_context():
# Imports
from . import routes
# Create tables for our models
db.create_all()
return app
然后在您run.py
或您用来启动应用程序的任何文件中,您可以执行此操作
from os import environ
from application import create_app
app = create_app(environ.get('FLASK_CONFIG'))
if __name__ == "__main__":
app.run(host='0.0.0.0')
希望这可以帮助。
推荐阅读
- windows - 为什么激活 conda 后我不能再使用常规的 git bash 命令?
- r - 无法将总和和相应的列值获取到数据框的行中
- entity-framework - Xamarin Forms dbContext MigrateAsync 崩溃
- javascript - 按键时使用 Javascript 进入和退出浏览器全屏视图
- c++ - c++11 list push_back() 实例化错误?
- mysql - MySQL:仅当字段值升序时才选择
- python-3.x - discord.py-rewrite 音乐 - 不能使用检查
- android - 获取 RSSI 值 -11 是否正确?
- java - Spring Boot 在 application.properties 中传递值/使用方法
- java - 为什么我的 recyclerview 会在文本快速更改时崩溃?