before_request()需要参数,导致程序失败

时间:2015-05-15 15:31:53

标签: python flask

我关注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()

1 个答案:

答案 0 :(得分:1)

before_request是装饰者。而不是调用它,而是直接将它应用于修饰函数。

@app.before_request
def my_before_request_function():
    pass

teardown_request的行为方式相同,因此您也需要更改它,否则您将收到相同的错误。

如果你回到教程并仔细查看代码,你会注意到他们没有直接调用装饰器。

使用修饰函数作为第一个(也是唯一的)参数调用装饰器。另一种装饰模式是&#34;装饰工厂&#34;,其中函数 接受参数,产生实际的装饰器(它只接受隐式修饰函数参数)。由于before_request不是工厂,因此文档只是说没有参数。