前言
在 Python 众多的 HTTP 客户端中,最有名的莫过于requests
、aiohttp
和httpx
。
在不借助其他第三方库的情况下,requests
只能发送同步请求;aiohttp
只能发送异步请求;httpx
既能发送同步请求,又能发送异步请求。
那么怎么选择呢
- 只发同步请求用
requests
,但可配合多线程变异步。 - 只发异步请求用
aiohttp
,但可以配合await变同步。 httpx
可以发同步请求也可以异步,但是请求速度同步略差于requests
,异步略差于aiohttp
这里不建议使用多线程来做异步请求,建议使用异步IO的方式。
asyncio
的优势:
可以异步请求。
可以普通请求也可以作为WS客户端连接。
可以作为WEB服务器和WEBSOCKET服务器。
性能较好。
安装依赖
1 | pip install aiohttp |
客户端
默认超时时间
1 | aiohttp.ClientTimeout( |
GET请求
基本请求
1 | import aiohttp |
获取状态码
1 | import aiohttp |
文件下载
1 | import aiohttp |
POST请求
基本用法
1 | import aiohttp |
Form-encoded
1 | import aiohttp |
Multipart-Encoded File
To upload Multipart-encoded files:
1 | url = 'http://httpbin.org/post' |
You can set the filename
and content_type
explicitly:
1 | url = 'http://httpbin.org/post' |
Streaming uploads
1 | with open("D://search.json", 'rb') as f: |
其它请求
1 | session.put('http://httpbin.org/put', data=b'data') |
WebSocket
1 | async with session.ws_connect('http://example.org/ws') as ws: |
发送消息
1 | await ws.send_str('data') |
服务端
WEB服务器
文本
1 | from aiohttp import web |
注解
1 | from aiohttp import web |
JSON
1 | from aiohttp import web |
From参数获取
1 | async def do_login(request): |
文件上传服务
First, make sure that the HTML <form>
element has its enctype attribute set to enctype="multipart/form-data"
.
1 | <form action="/store/mp3" method="post" accept-charset="utf-8" |
Then, in the request handler you can access the file input field as a FileField
instance.
FileField
is simply a container for the file as well as some of its metadata:
1 | async def store_mp3_handler(request): |
WebSockets
服务端
1 | import aiohttp |
客户端测试页面
页面
1 |
|
JS
1 | var socket = new WebSocket("ws://127.0.0.1:8888/ws"); |