python - Flask - 自定义装饰器打破路由

标签 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")

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

我想知道这是否是由于对 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 映射到“端点”,然后将端点映射到 View 函数。端点默认为 View 函数的 __name__ 属性。在这种情况下,装饰函数被传递给 app.route,因此对于这两个规则,端点都是 create_json_response,并且在这两种情况下都使用了为该端点定义的最后一个 View 。

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

关于python - Flask - 自定义装饰器打破路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11064263/

相关文章:

python - 如何在 python pandas 的同一列上进行分组并计算唯一值和某些值的计数作为聚合?

python - 编辑 PyCharm 的 Pep8

python - 如何忽略矩阵乘法中的零?

c# - 如何在 C# 中反序列化 JSON(多级)

ios - 如何在 AFnetworking 中设置内容类型

Django 测试返回 _wrapped_view 作为 View 名称而不是正确的 View 名称

python - Python中是否有相当于//运算符的上限?

java - Jackson 自定义序列化器在可选 <?> 中使用

c# - 如何在装饰器中定义事件和属性

python - Python如何解析装饰器名称