如何在Flask模块中重写PUT和DELETE的HTTP方法?

9 投票
1 回答
2929 浏览
提问于 2025-04-16 18:25

我在尝试在路由发生之前修改Flask的请求对象时遇到了困难。

我的API模块(不是整个Flask应用)需要通过发送一个特殊的头来模拟PUT和DELETE操作。我需要检查“-Method”这个头的内容,并在Flask进行路由之前相应地修改Flask的请求对象。

这是我想要实现的简短、清晰的代码:

@api.before_request
def method_scrubbing():
    if request.headers.has_key('-Method'):
        method = request.headers['-Method'].upper()
        tagalog.log("in before_request, -Method = {}".format(method), 'force')
        if method not in ['PUT', 'DELETE']:
            raise ApiMethodException(method)
        else:
            request.method = method

...但是我遇到了一个来自werkzeug的“只读属性”错误:http://drktd.com/74yk

我看到Armin在http://flask.pocoo.org/snippets/38/的帖子,但这似乎是针对整个应用的(而不是特定于某个模块)。

1 个回答

8

Werkzeug假设请求只会在WSGI中间件里被修改,或者在Werkzeug获取数据之前被修改。这样做的原因是,Werkzeug就不需要去监控WSGI环境,看看是否需要清除缓存或者改变行为。

在这种情况下,如果你小心地修改底层的WSGI环境,可能会成功:

request.environ['REQUEST_METHOD'] = 'something'

之后,request.method应该会显示“某种东西”,并且行为应该会改变为表单解析。我没有尝试过这个,不知道是否有效。就我个人而言,我会写一个中间件,来为整个应用程序处理这个重写,或者做一些简单的URL前缀匹配来实现这个功能。

撰写回答