我关注flaskr tutorial。当我运行python flaskr.py
时,我收到此错误:
Traceback (most recent call last):
File "flaskr.py", line 26, in <module>
@app.before_request()
File "/Users/myname/anaconda/lib/python2.7/site-packages/flask/app.py", line 62, in wrapper_func
return f(self, *args, **kwargs)
TypeError: before_request() takes exactly 2 arguments (1 given)
但是,在第4步,它明确指出before_request()
不带参数。我仔细地遵循了所有指示。为什么我会收到此错误?
import sqlite3
from flask import Flask, g
DATABASE = '/tmp/flaskr.db'
app = Flask(__name__)
app.config.from_object(__name__)
def connect_db():
return sqlite3.connect(app.config['DATABASE'])
@app.before_request()
def before_request():
g.db = connect_db()
@app.teardown_request()
def teardown_request(exception):
db = getattr(g, 'db', None)
if db is not None:
db.close()
if __name__ == '__main__':
app.run()
答案 0 :(得分:1)
before_request
是装饰者。而不是调用它,而是直接将它应用于修饰函数。
@app.before_request
def my_before_request_function():
pass
teardown_request
的行为方式相同,因此您也需要更改它,否则您将收到相同的错误。
如果你回到教程并仔细查看代码,你会注意到他们没有直接调用装饰器。
使用修饰函数作为第一个(也是唯一的)参数调用装饰器。另一种装饰模式是&#34;装饰工厂&#34;,其中函数 接受参数,产生实际的装饰器(它只接受隐式修饰函数参数)。由于before_request
不是工厂,因此文档只是说没有参数。