添加 HTTP 方法重载¶

一些 HTTP 代理不支持所有 HTTP 方法或者不支持一些较新的 HTTP 方法(例如PACTH )。在这种情况下,可以通过使用完全相反的协议,用一种 HTTP 方法来“代理”另一种 HTTP 方法。

实现的思路是让客户端发送一个 HTTP POST 请求,并设置X-HTTP-Method-Override 头部为需要的 HTTP 方法(例如 PATCH )。

通过 HTTP 中间件可以轻易的实现:

  1. class HTTPMethodOverrideMiddleware(object):
  2. allowed_methods = frozenset([
  3. 'GET',
  4. 'HEAD',
  5. 'POST',
  6. 'DELETE',
  7. 'PUT',
  8. 'PATCH',
  9. 'OPTIONS'
  10. ])
  11. bodyless_methods = frozenset(['GET', 'HEAD', 'OPTIONS', 'DELETE'])
  12.  
  13. def __init__(self, app):
  14. self.app = app
  15.  
  16. def __call__(self, environ, start_response):
  17. method = environ.get('HTTP_X_HTTP_METHOD_OVERRIDE', '').upper()
  18. if method in self.allowed_methods:
  19. method = method.encode('ascii', 'replace')
  20. environ['REQUEST_METHOD'] = method
  21. if method in self.bodyless_methods:
  22. environ['CONTENT_LENGTH'] = '0'
  23. return self.app(environ, start_response)

通过以下代码就可以与 Flask 一同工作了:

  1. from flask import Flask
  2.  
  3. app = Flask(__name__)
  4. app.wsgi_app = HTTPMethodOverrideMiddleware(app.wsgi_app)

原文: https://dormousehole.readthedocs.io/en/latest/patterns/methodoverrides.html