Flask 蓝图无法从配置文件中读取 sqlite3 数据库
Flask blueprint cannot read sqlite3 DATABASES from config file
我希望 Python Flask 从配置文件中读取 sqlite3 数据库名称的位置 而无需显式写入数据库名称 。使用的模板是:http://flask.pocoo.org/docs/0.11/patterns/sqlite3/ and 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)
您的 my_cool_app
是 Blueprint
的一个实例,它没有 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()
我希望 Python Flask 从配置文件中读取 sqlite3 数据库名称的位置 而无需显式写入数据库名称 。使用的模板是:http://flask.pocoo.org/docs/0.11/patterns/sqlite3/ and 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)
您的 my_cool_app
是 Blueprint
的一个实例,它没有 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()