【问题标题】:AsyncIO python3.4 restserverAsyncIO python3.4 restserver
【发布时间】:2023-03-28 01:27:01
【问题描述】:

我正在尝试使用 python 3.4 中的 asyncio 模块实现一个简单的安静服务器,但无法访问我定义的端点。当我对 URL (http://127.0.0.1:8080/v1/queue) 执行 CURL (GET 请求) 时,我从服务器得到一个空响应。我认为我的 asyncio 基本类设置存在一些问题。有人可以指出吗?CURL 是否需要以异步方式实现,它使用 aiohttp 发送请求?

这是我的代码:

  4 import asyncio
  5 import aiorest
  6 import json
  8 
 10 
 11 class Sample(aiorest.RESTServer):
 12 
 13     def _init__(self, *args, **kwargs):
 14         super().__init__(*args, **kwargs)
 15         self.add_url('GET', '/v1/queue', self.get_handler)
 16         self.add_url('POST', '/v1/stack', self.post_handler)

 19     def get_handler(self, request):
 20         return {'Welcome': 'user'}
 21 
 22     def post_handler(self, request, payload):
 23         if not payload:
 24             return {'error': 'Payload not supplied'}
 25 
 26         try:
 27             json_payload = json.loads(payload)
 28         except ValueError:
 29             return {'error': 'Invalid JSON supplied'}
 30         print('Payload received {0}'.format(json_payload))
 32         return {'Payload Received Success'}
 33 
 34 
 35 def main():
 36     loop = asyncio.get_event_loop()
 37     server = Sample(hostname='127.0.0.1', loop=loop)
 38     srv = loop.run_until_complete(loop.create_server(
 39         server.make_handler, '127.0.0.1', 8080))
 40     print('Server listening on port 8080')

 44     try:
 45         loop.run_forever()
 46     except KeyboardInterrupt:
 47         pass
 48     finally:
 49         srv.close()
 50         loop.run_until_complete(srv.wait_closed())
 51         loop.close()
 52 
 53 
 54 if __name__ == '__main__':
 55     main()

【问题讨论】:

    标签: rest oop curl python-3.4 python-asyncio


    【解决方案1】:

    代码不起作用的原因是示例类构造函数_init__ 中的一个简单拼写错误,而不是__init__。修复此问题后,一切都应按预期工作。

    编辑

    处理程序方法应该只需要request 参数,可以从传递的request 中获取主体。

    def post_handler(self, request):
        payload = request._request_body.decode('utf-8')
        if not payload:
            return {'error': 'Payload not supplied'}
    
        try:
            json_payload = json.loads(payload)
        except ValueError:
            return {'error': 'Invalid JSON supplied'}
        print('Payload received {0}'.format(json_payload))
        return {'result': 'Payload Received Success'}
    

    提示

    顺便说一句,the development of aiorest has stopped

    【讨论】:

    • 我可以发送 GET 请求,但是当我 curl 时,我的 POST 总是返回一个空响应。我将有效负载初始化为 request.data。我认为使用 CURL 传递的数据没有在我的 post_handler 中设置为有效负载。您能否指出,如何从请求对象在我的 post_handler 中设置有效负载?谢谢
    • 没关系,我使用 aiohttp 让一切正常。
    • 谢谢。我最终使用了 payload = request.text() ,它返回一个字符串,然后 json.loads(payload) 因为这是 aiohttp 中可用的有效请求方法 - aiohttp.readthedocs.org/en/stable/web_reference.html#request
    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多