python – 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")

我希望GET请求/ test返回类似{“result”:“Test success”}的内容,但事实并非如此.相反,任何请求似乎都匹配最后一条路线,即家.为什么?

我想知道这是否是由于json_response的不同调用之间缺少绝缘而引起的?

提前致谢.

最佳答案
正如ВидулПетров所说,解决方案是使用functools.wraps

import functools
def json_response(action_func):
    @functools.wraps(action_func)
    def create_json_response(*args, **kwargs):
        ...
return create_json_response

原因是Flask的路由系统将URL映射到“端点”,然后将端点映射到查看功能.端点默认为视图函数的__name__属性.在这种情况下,修饰函数被传递给app.route,因此两个规则的端点都是create_json_response,并且在这两种情况下都使用了为该端点定义的最后一个视图.

functools.wraps从原始函数中获取__name__(和其他属性)并修复此问题.在装饰包装中使用它总是一个好主意.

转载注明原文:python – Flask – 自定义装饰器打破了路由 - 代码日志