如何在Flask模块中重写PUT和DELETE的HTTP方法?
我在尝试在路由发生之前修改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前缀匹配来实现这个功能。