如何为龙卷风编写中间件?

时间:2013-06-02 18:43:53

标签: python-2.7 tornado middleware

我龙卷风应用程序中对处理程序的每个请求都需要在处理请求之前检查并验证密钥。 我怎么能在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)

2 个答案:

答案 0 :(得分:4)

可以使用装饰器:

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):
      ...

答案 1 :(得分:0)

实际上你可以连接中间件。 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请求处理可以是异步的,因此您无法修改中间件中的响应,但您至少可以使用该请求。