如何在Flask模块中覆盖PUT和DELETE的HTTP方法?

Kyl*_*ild 8 python werkzeug flask

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

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

这是我想要工作的简短,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
Run Code Online (Sandbox Code Playgroud)

...但是我从werkzeug得到了一个"只读属性"错误:http: //drktd.com/74yk

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

Arm*_*her 7

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

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

request.environ['REQUEST_METHOD'] = 'something'
Run Code Online (Sandbox Code Playgroud)

之后request.method应该显示"某事",行为应该改变以形成解析.我没有试过这个,也不知道它是否会起作用.就个人而言,我会编写一个中间件,对整个应用程序进行重写,或者为这种行为做一些简单的url前缀匹配.