首页 > 解决方案 > 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

标签: pythonflask

解决方案


如果您的应用程序结构与您所遵循的教程中所示的相同,请尝试将您的更改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')

希望这可以帮助。


推荐阅读