在 api 端点内发出 http 请求
making a http request within a api endpoint
我正在尝试在 post api 端点内发出请求。到目前为止,我已经做到了 Async
,但是我想知道这种情况下的行为如何。如果 fetch
失败,我想输出一条消息。但是因为它是 Async
n 我猜底部的 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"
})
Tornado 通常是单线程的,因此您不应阻塞请求处理程序。使用异步客户端是实现你想要的东西的正确方法。
您必须使自己的 'post' 处理程序异步,即 return 在它实际完成工作并在 'post' 到后台时完成传入请求之前结束 API 您正在呼叫的完成。
在此处查看龙卷风文档中的示例:
http://www.tornadoweb.org/en/stable/web.html#decorators
(tornado.web.asynchronous 装饰器部分中有一个示例显示在服务器处理程序方法中使用 AsyncHTTPClient - 几乎正是您在这里需要的)
我正在尝试在 post api 端点内发出请求。到目前为止,我已经做到了 Async
,但是我想知道这种情况下的行为如何。如果 fetch
失败,我想输出一条消息。但是因为它是 Async
n 我猜底部的 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"
})
Tornado 通常是单线程的,因此您不应阻塞请求处理程序。使用异步客户端是实现你想要的东西的正确方法。
您必须使自己的 'post' 处理程序异步,即 return 在它实际完成工作并在 'post' 到后台时完成传入请求之前结束 API 您正在呼叫的完成。
在此处查看龙卷风文档中的示例:
http://www.tornadoweb.org/en/stable/web.html#decorators
(tornado.web.asynchronous 装饰器部分中有一个示例显示在服务器处理程序方法中使用 AsyncHTTPClient - 几乎正是您在这里需要的)