在api端点中发出http请求

2024-06-01 06:36:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在post-api端点内发出请求。到目前为止,我已经做到了Async,但是我想知道这种情况下的行为是怎样的。如果fetch失败,我想输出一条消息。但是,既然是Asyncn,我猜底部的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"
        })

Tags: toselffieldfieldsifrequestdefstatus
1条回答
网友
1楼 · 发布于 2024-06-01 06:36:35

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

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

参见龙卷风文档中的示例:

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

(下面是一个例子tornado.web.asynchronous网站decorator部分,该部分显示了在服务器处理程序方法中使用AsyncHTTPClient(这正是您需要的)

相关问题 更多 >