1

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

2 回答 2

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):
      ...
于 2013-06-02T19:11:03.810 回答
1

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

于 2018-03-30T08:36:50.857 回答