python – Flask – ‘NoneType’对象不可调用

前端之家收集整理的这篇文章主要介绍了python – Flask – ‘NoneType’对象不可调用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发我的第一个Flask应用程序.直接从 this获取一些代码,我试图确保用户的cookie中存在一个值.
  1. def after_this_request(f):
  2. if not hasattr(g,'after_request_callbacks'):
  3. g.after_request_callbacks = []
  4. g.after_request_callbacks.append(f)
  5. return f
  6.  
  7. @app.after_request
  8. def call_after_request_callbacks(response):
  9. for callback in getattr(g,'after_request_callbacks',()):
  10. response = callback(response)
  11. return response
  12.  
  13. @app.before_request
  14. def detect_unique_id():
  15. unique_id = request.cookies.get('unique_id')
  16. if unique_id is None:
  17. unique_id = generate_unique_id()
  18. @after_this_request
  19. def remember_unique_id(response):
  20. response.set_cookie('unique_id',unique_id)
  21. g.unique_id = unique_id

我一直收到这个错误

  1. Traceback (most recent call last):
  2. File "/..../env/lib/python2.7/site-packages/flask/app.py",line 1701,in __call__
  3. return self.wsgi_app(environ,start_response)
  4. File "/..../env/lib/python2.7/site-packages/flask/app.py",line 1690,in wsgi_app
  5. return response(environ,start_response)
  6. TypeError: 'NoneType' object is not callable

我试图了解这个错误的原因.请帮忙.

解决方法

问题

remember_unique_id不返回响应对象,但call_after_request_callbacks将调用通过after_this_request装饰器添加的每个回调的结果分配给结果,然后返回它.也就是说:

  1. # This
  2. for callback in getattr(g,()):
  3. response = callback(response)
  4.  
  5. # translates to this
  6. for callback in [remember_unique_id]:
  7. response = callback(response)
  8.  
  9. # which translates to this
  10. response = remember_unique_id(response)
  11.  
  12. # which translates to this
  13. response = None

解决方

或者:

>更新remember_unique_id以返回已修改的响应对象
>更新call_after_request_callbacks以检查返回的对象并确保它不是None:

  1. for callback in getattr(g,()):
  2. result = callback(response)
  3. if result is not None:
  4. response = result

为什么会这样?

Flask是一个WSGI应用程序,它希望响应是一个WSGI应用程序(即一个可调用的对象).当它处理来自视图模板的响应时,它会运行一些检查以确保它可以用作响应对象,如果返回的值不是WSGI应用程序,则将其转换为一个.它不会检查响应对象是否未被after_request修饰符更改,因此当它尝试调用响应对象时(此时它假定它是一个有效的WSGI应用程序),您将获得TypeError.

猜你在找的Python相关文章