一般服务器端可以监听端口,然后根据不同的路径将请求分发到不同的处理类上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','')
就是这么简单。
网友评论