代码之家  ›  专栏  ›  技术社区  ›  Peter Pik

在api端点内发出http请求

  •  0
  • Peter Pik  · 技术社区  · 6 年前

    Async 不过,我想知道这种情况下的表现如何。如果 fetch 失败,我想输出一条消息。但既然是 异步 我想是的 self.finish _upload_to_nsq() 完成了吗?这里最好的方法是使其同步,或者如何改进代码以在错误期间输出消息?

    class Handler(base.BaseHandler):
    
        def _upload_to_nsq(self):
            request = tornado.httpclient.HTTPRequest(
                '{}:4151/pub?topic=chamelo'.format(settings.nsqdlookup_address),
                body=self.request.body.decode(),
                method="POST")
    
            client = tornado.httpclient.AsyncHTTPClient()
            client.fetch(request)
    
    
        def _valiate_required_fields(self):
            missing_fields = []
            all_required_fields = ['state', 'upsert', 'schema']
    
            for field in all_required_fields:
                if field not in self.json_args:
                    missing_fields.append(field)
    
            if len(missing_fields) > 0:
                raise FieldException('Require following fields: %s' % ', '.join(missing_fields))
    
    
        @tornado.web.removeslash
        def post(self):
            # Validate if required keys are present
            try:
                self._valiate_required_fields()
            except FieldException as e:
                self.set_status(400)
                self.finish({
                "code": 400,
                    "message": str(e)
                })
    
            # Post request to nsqdlookup
            try:
                self._upload_to_nsq()
            except Error as e:
                self.set_status(400)
                self.finish({
                "code": 400,
                    "message": str(e)
                })
    
            # Everything is good
    
            self.set_status(200)
            self.finish({
                "code": 200,
                "message": "Ok"
            })
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Leo K    6 年前

    Tornado通常是单线程的,因此不应该阻塞请求处理程序。使用异步客户机是实现所需功能的正确方法。

    您必须使自己的“post”处理程序异步,即在它实际完成工作之前返回,并在您调用的后端API的“post”完成时完成传入请求。

    请参阅此处龙卷风文档中的示例:

    http://www.tornadoweb.org/en/stable/web.html#decorators

    (在tornado.web.asynchronous decorator一节中有一个示例,它显示了在服务器处理程序方法中使用AsyncHTTPClient的情况—这正是您需要的)