Flask蓝图无法从配置文件中读取sqlite3 DATABASES

时间:2016-10-10 20:07:46

标签: python flask sqlite blueprint

我希望Python Flask从配置文件中读取sqlite3数据库名称的位置,而不显式写入数据库名称。使用的模板有:http://flask.pocoo.org/docs/0.11/patterns/sqlite3/http://flask.pocoo.org/docs/0.11/tutorial/dbcon/

当我尝试从配置文件中读取“DATABASE”时,收到以下错误消息:

文件“/app/my_cool_app/app/init.py”,第42行,在before_request中     g.db = connect_db()

文件“/app/my_cool_app/app/init.py”,第36行,在connect_db中     return sqlite3.connect(my_cool_app.config ['DATABASE'])

AttributeError:'Blueprint'对象没有属性'config'

当我尝试从配置文件中读取并出现上述错误时,这是​​我的 init .py代码:

import sqlite3
from flask import Flask, g
from .views import my_cool_app

# create application
def create_app(debug=True):
    app = Flask(__name__, instance_relative_config=True)
    app.debug = debug
    app.config.from_object('config')
    app.config.from_pyfile('config.py')
    app.register_blueprint(my_cool_app)
    return app

def connect_db():
    return sqlite3.connect(my_cool_app.config['DATABASE'])  <= LINE 36

@my_cool_app.before_request
def before_request():
    g.db = connect_db()

@my_cool_app.teardown_request
def teardown_request(exception):
    db = getattr(g, 'db', None)
    if db is not None:
        db.close()

这是我的run.py(我不会改变它):

from app import create_app
app = create_app()

这是我的 init .py代码,当我明确写出DB名称(不是我想要的)时,它可以正常工作:

import sqlite3
from flask import Flask, g
from .views import my_cool_app
DATABASE='/app/myappname/my_sqlite3_database_name.db'

# create application
def create_app(debug=True):
    app = Flask(__name__, instance_relative_config=True)
    app.debug = debug
    app.config.from_object('config')
    app.config.from_pyfile('config.py')
    app.register_blueprint(my_cool_app)
    return app

def connect_db():
    return sqlite3.connect(DATABASE)

1 个答案:

答案 0 :(得分:1)

您的my_cool_appBlueprint的一个实例,其中没有config属性。您需要使用current_app

import sqlite3
from flask import Flask, g, current_app
from .views import my_cool_app

# create application
def create_app(debug=True):
    app = Flask(__name__, instance_relative_config=True)
    app.debug = debug
    app.config.from_object('config')
    app.config.from_pyfile('config.py')
    app.register_blueprint(my_cool_app)
    return app

def connect_db():
    return sqlite3.connect(current_app.config['DATABASE'])

@my_cool_app.before_request
def before_request():
    g.db = connect_db()

@my_cool_app.teardown_request
def teardown_request(exception):
    db = getattr(g, 'db', None)
    if db is not None:
        db.close()