我很难在路由发生之前尝试修改Flask请求对象。

我的API模块(不是我的整个Flask应用程序)依赖于通过发送特殊 header 来伪造PUT和DELETE操作。在Flask进行路由之前,我需要 check out “-Method” header 的内容并相应地修改Flask Request对象。

这是我想工作的简短的,Python式的,显式的代码:

@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/上的帖子,但这似乎是应用程序范围的(不是特定于模块的)。

最佳答案

Werkzeug假设仅在WSGI中间件中或在Werkzeug有权访问数据之前才修改请求。原因是这样,Werkzeug不必监视WSGI环境来查看它是否必须使缓存无效或更改行为。

在这种特殊情况下,如果您仔细修改底层WSGI环境,可能会成功:

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

之后,request.method应该显示“某物”,并且行为应更改为形式解析。我还没有尝试过,也不知道它是否有效。我个人将编写一个中间件来为整个应用程序进行重写,或者为该行为做一些简单的URL前缀匹配。

09-20 22:38