abh*_*nav 11 python werkzeug flask
我正在开发我的第一个Flask应用程序.直接服用一些代码出来这个,我想确保一个值是存在于用户的Cookie.
def after_this_request(f):
if not hasattr(g, 'after_request_callbacks'):
g.after_request_callbacks = []
g.after_request_callbacks.append(f)
return f
@app.after_request
def call_after_request_callbacks(response):
for callback in getattr(g, 'after_request_callbacks', ()):
response = callback(response)
return response
@app.before_request
def detect_unique_id():
unique_id = request.cookies.get('unique_id')
if unique_id is None:
unique_id = generate_unique_id()
@after_this_request
def remember_unique_id(response):
response.set_cookie('unique_id', unique_id)
g.unique_id = unique_id
Run Code Online (Sandbox Code Playgroud)
我一直收到这个错误:
Traceback (most recent call last):
File "/..../env/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
return self.wsgi_app(environ, start_response)
File "/..../env/lib/python2.7/site-packages/flask/app.py", line 1690, in wsgi_app
return response(environ, start_response)
TypeError: 'NoneType' object is not callable
Run Code Online (Sandbox Code Playgroud)
我试图了解这个错误的原因.请帮忙.
Sea*_*ira 10
remember_unique_id不会返回响应对象,而是call_after_request_callbacks将调用每个回调的结果分配给after_this_request装饰器result,然后返回它.也就是说:
# This
for callback in getattr(g, 'after_request_callbacks', ()):
response = callback(response)
# translates to this
for callback in [remember_unique_id]:
response = callback(response)
# which translates to this
response = remember_unique_id(response)
# which translates to this
response = None
Run Code Online (Sandbox Code Playgroud)
或者:
remember_unique_id以返回已修改的响应对象更新call_after_request_callbacks以检查返回的对象并确保它不是None:
for callback in getattr(g, 'after_request_callbacks', ()):
result = callback(response)
if result is not None:
response = result
Run Code Online (Sandbox Code Playgroud)Flask是一个WSGI应用程序,它希望response是一个WSGI应用程序(即一个可调用的对象).当它处理来自视图模板的响应时,它会运行一些检查以确保它可以用作响应对象,如果返回的值不是WSGI应用程序,则将其转换为一个.它并没有检查响应对象并没有被改变的after_request装饰,所以当它试图调用响应对象(它假定在这一点上有效的WSGI应用程序),你得到的TypeError.