美文网首页
tornado url中带有参数以及header中带有参数的获取

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

作者: 欠我的都给我吐出来 | 来源:发表于2020-05-28 15:59 被阅读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','')
    

    就是这么简单。

    相关文章

      网友评论

          本文标题:tornado url中带有参数以及header中带有参数的获取

          本文链接:https://www.haomeiwen.com/subject/vyjaahtx.html