9

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

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

这是我想要工作的简短、pythonic、显式的代码:

@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

我在http://flask.pocoo.org/snippets/38/上似乎看到了 Armin 的帖子,但这似乎是应用程序范围的(不特定于模块)。

4

1 回答 1

8

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

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

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

之后request.method应该显示“某事”并且行为应该改变为形式解析。我没有尝试过,不知道它是否会起作用。就我个人而言,我会编写一个中间件来重写整个应用程序,或者可能为该行为做一些简单的 url 前缀匹配。

于 2011-05-26T20:11:44.547 回答