2011-05-26 58 views
7

我很难在路由发生之前尝试修改Flask请求对象。如何覆盖Flask模块中PUT和DELETE的HTTP方法?

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

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

回答

6

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

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

request.method后应该显示“东西”和行为应该改变,形成解析:

在这种特殊情况下,如果你仔细修改基础WSGI环境中,您可能会成功但是。我没有试过这个,也不知道它是否会起作用。就我个人而言,我会写一个中间件来完成整个应用程序的重写,或者为这种行为做一些简单的url前缀匹配。

+0

不太好用。如果我按照你所说的那样做,并且将request.environ ['REQUEST_METHOD']'设置为''PUT'','request.method'确实在之后立即显示值为''PUT''。然而,该请求仍然被路由到它将要去的地方(在这种情况下,到用'@ api.route('/ isoSpace//tile/',methods = ['POST'])装饰的路线) ')。在该函数中,'request.method'再次看起来像“POST”。 – 2011-05-26 22:32:05

+0

有没有办法让中间件只适用于一个模块? – 2011-05-26 22:36:28

+0

WSGI层中不存在中间件。但是,您可以让中间件执行一些基本路径检查。 – 2011-05-27 11:17:08

相关问题