tornado url中带有参数以及header中带有参数的获取

2020-05-28  本文已影响0人  欠我的都给我吐出来

一般服务器端可以监听端口,然后根据不同的路径将请求分发到不同的处理类上Handler.
比如下面的代码就监听了3500端口,并且不同会将不同的路径的请求交给不同的handler处理。

一、 URL上不带有参数:

比如请求127.0.0.1:3500/ocr/v1/idcard.json,就会交给Apihandler这个处理程序去处理,同时v1和idcard会作为参数传入Apihandler的post方法或者get方法(具体看这个请求是post请求还是get请求),假设这是一个post请求,那么Apihandler的post方法是这样的:

async def post(self, version, path):
  pass

version参数就是"v1",path参数就是"idcard",可以在函数内部被使用。

如果请求完全匹配,比如127.0.0.1:3500/ocr/doc,那么就不需要再handler的post或者get请求中。

import tornado.options
import tornado.web
from tornado.options import define, options
import env
from apiserver.api_handler import ApiHandler
from apiserver.demo_handler import DemoHandler_ID, doc, main_page
import logging
from apiserver.general_handler import General_Reply
import platform

def make_app():
return tornado.web.Application([(r"/ocr/(.+)/(.+).json", ApiHandler),
                                (r"/ocr/demo/(.+)", DemoHandler_ID),
                                (r"/ocr/doc", doc),
                                (r"/ocr/gene", General_Reply),
                                (r"/ocr/demo", main_page)],                            static_path=os.path.join(os.path.dirname(__file__), "static"),                            template_path=os.path.join(os.path.dirname(__file__), "views"))


def main():
    tornado.options.parse_command_line()
    application = make_app()
    http_server = tornado.httpserver.HTTPServer(application, xheaders=True)

    if int(options.prefork):
        http_server.bind(3500)
        http_server.start(0)
    else:
        http_server.listen(3500)

    app_logger = logging.getLogger('tornado.application')
    app_logger.info("Listening on {}:{}".format(127.0.0.1, 3500))
if __name__ == "__main__":
    main()
    tornado.ioloop.IOLoop.instance().start()

二、url上带有参数

一般可以把参数放在header中,比如说鉴权参数Authorization。这样我们可以在handler中优雅的处理这些参数:

if 'Authorization' not in self.request.headers:
    logging.error("No Authorization header found")
    return False

如果参数被放在url中,以这样的形式:127.0.0.1:3500/v1/idcard?access_token=Kjzt6CxlRfhUNk1q
那么在处理的时候怎么处理呢?
仿照上面的代码,路径处理部分保持不变:

def make_app():
    return tornado.web.Application([
        (r"/ocr/v1/idcard", ApiHandler)],
        static_path=os.path.join(os.path.dirname(__file__), "static"),
        template_path=os.path.join(os.path.dirname(__file__), "views"))

在handler中使用get_query_argument方法获取url上的参数
class ApiHandler(tornado.web.RequestHandler):
async def post(self):
    # 获取对应的处理程序代
    access_token = self.get_query_argument('access_token','')

就是这么简单。

上一篇 下一篇

猜你喜欢

热点阅读