我很难在路由发生之前尝试修改Flask请求对象。
我的API模块(不是我的整个Flask应用程序)依赖于通过发送特殊标头伪造PUT和DELETE操作。我需要查看“-Method”标题的内容,并在Flask进行路由之前相应地修改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的帖子,但这似乎是应用程序范围的(不是特定于模块)。
答案 0 :(得分:7)
Werkzeug假设请求仅在WSGI中间件中修改,或者在Werkzeug访问数据之前。原因是这样Werkzeug不必监视WSGI环境,看它是否必须使缓存无效或改变行为。
在这种特殊情况下,如果您仔细修改底层WSGI环境,则可能会成功:
request.environ['REQUEST_METHOD'] = 'something'
之后request.method
应该显示“某事”并且行为应该更改为表单解析。我没有试过这个,也不知道它是否会起作用。我个人会编写一个中间件来为整个应用程序进行重写,或者为这种行为做一些简单的url前缀匹配。