轻量级python http客户端
lowhaio的Python项目详细描述
低海
轻量级python异步http/1.1客户端。不创建其他任务;所有代码都在一个模块中;除了标准库之外,只需要一个依赖项,aiodnsresolver
lowhaio有一个故意限制的范围:它包含的代码足够成为一个有用的http客户端,并且允许在需要时在顶部添加更复杂的行为。
连接是DNS感知的,因为它们只在与域的当前A记录匹配时才被重用。
安装
pip install lowhaio
用法
api首先是流:对于请求和响应主体,都使用异步迭代器。
importasynciofromlowhaioimportPoolasyncdefmain():request,close=Pool()asyncdefrequest_body():yieldb'a'yieldb'bc'code,headers,response_body=awaitrequest(b'POST','https://postman-echo.com/post',headers=((b'content-length',b'3'),(b'content-type',b'text/plain'),),body=request_body,)asyncforchunkinresponse_body:print(chunk)awaitclose()loop=asyncio.get_event_loop()loop.run_until_complete(main())
但是,如果不需要或不可能,则有助手函数streamed
和buffered
。
importasynciofromlowhaioimportPool,streamed,bufferedasyncdefmain():request,close=Pool()request_body=streamed(b'abc')code,headers,response_body=awaitrequest(b'POST','https://postman-echo.com/post',headers=((b'content-length',b'3'),(b'content-type',b'text/plain'),),body=request_body,)print(awaitbuffered(response_body))awaitclose()loop=asyncio.get_event_loop()loop.run_until_complete(main())
标题
自动添加到请求中的唯一头是host
头,它是来自请求的url的idna/punycode编码域名。
例外情况
例外情况通常是HttpError
的子类。如果是较低级别的异常导致了这种情况,那么它将在HttpError
的__cause__
属性中设置。具体来说,在发送任何数据之前,引发HttpConnectionError
,在发送数据之后,引发HttpDataError
。这一区别是为了能够知道是否可以重试非等幂请求。
但是,允许asyncio.CancelledError
和不从Exception
发出指令的异常(例如SystemExit
)冒泡。
自定义SSL上下文
lowhaio可以通过get_ssl_context
参数到Pool
与自定义ssl上下文一起使用。例如,要使用certifi ca bundle,可以通过
pip install certifi
使用如下。
importasyncioimportsslimportcertififromlowhaioimportPool,buffered,streamedasyncdefmain():request,close=Pool(get_ssl_context=lambda:ssl.create_default_context(cafile=certifi.where()),)request_body=streamed(b'abc')code,headers,response_body=awaitrequest(b'POST','https://postman-echo.com/post',headers=((b'content-length',b'3'),(b'content-type',b'text/plain'),),body=request_body,)print(awaitbuffered(response_body))awaitclose()loop=asyncio.get_event_loop()loop.run_until_complete(main())
范围
核心功能的范围仅限于:
- (TLS)连接打开、关闭和池化;
- 传递和接收http头和流媒体体;
- 解码分块响应;
- 在超时时引发异常。
这是为了使核心行为在合理的使用范围内有用,但是not包含可以由顶层添加的内容。特别不包括:
- 以下重定向由lowhaio-redirect; 实现
- 重试失败的请求,由lowhaio-retry; 实现
- 编码分块请求,由lowhaio-chunked; 实现
- 身份验证,例如由lowhaio-aws-sigv4实现的aws签名版本4,或由lowhaio-aws-sigv4-unsigned-payload;
- 压缩/解压缩请求/响应;
- 饼干。