新手在学 flask 开发 T.T ,看到《 python web 开发》第十章的用户资料, 在搞 管理员级别的资料编辑器 那里出问题了, 视图函数抛出异常,不能返回响应 。百度,谷歌, sof 无果。找好久了没解决,心塞 所以来寻求帮助,谢谢能提供帮助的人
检查过好几遍了,views.py,forms.py,模板都没发现问题
折腾了一晚上都没搞定,T.T 简直要哭了
解决过程:
后来求助于网络社区,在网友’sdg’帮助下才找到问题,感谢~~
http://cocode.cc/t/valueerror-view-function-did-not-return-a-response/7283/2
检查用户权限的自定义装饰器出问题了decorators.py:
from functools import wraps
from flask import abort
from flask_login import current_user
from .models import Permission
def permission_required(permission):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.can(permission):
abort(403)
return f(*args, **kwargs) # 此行缩进错误,应在if语句外
return decorated_function
return decorator
def admin_required(f):
return permission_required(Permission.ADMINISTER)(f)
修正后decorators.py:
from functools import wraps
from flask import abort
from flask_login import current_user
from .models import Permission
def permission_required(permission):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.can(permission):
abort(403)
return f(*args, **kwargs)
return decorated_function
return decorator
def admin_required(f):
return permission_required(Permission.ADMINISTER)(f)
总结:
- 自己粗心大意,切勿急躁
- python代码缩进问题,网友都建议缩进用4个空格,用1个tab代替风险太大,因为各家的编辑器对tab键定义存在差异,很容易出问题
不过我还有一问题,为什么错误页面抛出的是 视图函数 View function 的问题,
而不会抛出装饰器那边的错误,例如( IndentationError ):
@admin_required → def permission_required(permission)
使用 app.route 注册视图时,装饰器也是视图函数的一部分,所以会提示 View function did not return a response。