【问题标题】:how do I write a middleware for tornado?我如何为龙卷风编写中间件?
【发布时间】:2013-06-02 18:43:53
【问题描述】:

我的 tornado 应用程序中对处理程序的每个请求都需要在处理请求之前检查和验证密钥。 如何在 Tornado 中创建一个中间件类,在处理请求之前检查和验证密钥?

我的中间件类函数看起来像这样。

class Checker(object):

    def process_request(self, request):
        try:
            key = request.META['HTTP_X_KEY']
        except KeyError:
            key = None

        if key and key == os.environ.get('KEY'):
            #Process the request
            return None
        #Redirect to Home Page
        return HttpResponsePermanentRedirect('http://google.com', status=301)

【问题讨论】:

    标签: python-2.7 tornado middleware


    【解决方案1】:

    可以使用装饰器:

    from functools import wraps
    def check_key(f):
        @wraps(f)
        def wrapper(self, request):
            try:
                key = request.META['HTTP_X_KEY']
            except KeyError:
                key = None
            if key and key == os.environ.get('KEY'):
                #Process the request
                f(self, request)
                return None
            #Redirect to Home Page
            return HttpResponsePermanentRedirect('http://google.com', status=301)
        return wrapper
    
    class Checker(object):
       @check_key
       def process_request(self, request):
          ...
    

    【讨论】:

    • 当您需要处理所有请求时,装饰器方法没有多大帮助
    【解决方案2】:

    实际上,您可以连接中间件。 HTTPServer 请求处理程序只是可调用对象(实现__call__ 的函数、方法或对象)。您可以编写自己的处理程序,将请求传递给您的应用程序:

    my_app = tornado.web.Application(...)
    
    def middleware(request):
        # do whatever transformation you want here
        my_app(request)
    
    if __name__ == '__main__':
        http_server = tornado.httpserver.HTTPServer(middleware)
        # ...`
    

    由于 Tornado 请求处理可以是异步的,因此您无法修改中间件中的响应,但您至少可以处理请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多