phi*_*dah 10 python json decorator flask
我有以下Flask路线和自定义助手:
from spots import app, db
from flask import Response
import simplejson as json
def json_response(action_func):
def create_json_response(*args, **kwargs):
ret = action_func(*args, **kwargs)
code = 200
if len(ret) == 2:
code = ret[0]
resp = ret[1]
else:
resp = ret[0]
return Response(
response=json.dumps(resp, indent=4),
status=code,
content_type='application/json'
)
return create_json_response
@app.route('/test')
@json_response
def test():
return 400, dict(result="Test success")
@app.route('/')
@json_response
def home():
return 200, dict(result="Home success")
Run Code Online (Sandbox Code Playgroud)
我希望GET请求/ test返回类似{"result":"Test success"}但不是这样的情况.相反,任何请求似乎都匹配最后一条路线,即home.为什么?
我想知道这是不是因为不同的电话之间缺少绝缘json_response?
提前致谢.
Sim*_*pin 13
正如ВидулПетров所说,解决方案是使用functools.wraps:
import functools
def json_response(action_func):
@functools.wraps(action_func)
def create_json_response(*args, **kwargs):
...
return create_json_response
Run Code Online (Sandbox Code Playgroud)
原因是Flask的路由系统将URL映射到"端点",然后将端点映射到查看功能.端点默认为__name__视图功能的属性.在这种情况下,已传递装饰函数,app.route因此端点create_json_response用于两个规则,并且在两种情况下都使用为该端点定义的最后一个视图.
functools.wraps __name__从原始函数中获取(和其他属性)并修复此问题.在装饰包装中使用它总是一个好主意.
| 归档时间: |
|
| 查看次数: |
3179 次 |
| 最近记录: |