aiohttp基本使用

前言

这次系统分析与设计大作业我负责web后端开发工作,本来又想使用flask框架的,但是想想flask框架都有点审美疲劳了,而且flask框架是阻塞式框架,效率未免有点不高。所以这次我使用了异步web框架aiohttp,简单记录一下基本使用,至于框架原理之类后面再深入研究。

官方文档


hello world

简单hello world代码

1
2
3
4
5
6
7
8
9
from aiohttp import web

if __name__ == "__main__":
app = web.Application()
async def hello(request):
return web.Response(text = "hello")

app.router.add_get("/", hello)
web.run_app(app, port = 5000)

在路由中添加视图函数
1.get

url例子: /

1
app.router.add_get("/", hello)

url例子: /api/order/3

1
app.router.add_get("/api/order/{id}", reservation_view.get_order)

使用以下获取参数id

1
id = int(request.match_info['id'])

url例子: /test?uuid=12
使用以下获取url参数

1
uuid = request.rel_url.query['uuid']

2.post

1
app.router.add_post("/api/order", reservation_view.create_order)

使用以下获取表单data

1
data = await request.post()


问题

在这次系分的后端开发过程中,遇到了一个我以前也遇到过的问题,但是我忘记了以前我是怎么解决的了。问题就是,当post的表单中有一个value值为一个list,那么服务端这边接受会这样?

上面的问题就是服务端这边接受了这个字典之后,会发现这个list的value值已经变形了,具体情况如下:
发送表单

1
2
3
4
5
6
7
8
9
10
11
import requests

if __name__ == "__main__":
session = requests.Session()
data = {
"table": 1,
"list": [{'id': '1', 'name': 'pork', 'count': 1, 'price': 20}, {'id': '2', 'name': 'fish', 'count': 1, 'price': 23}]
}
print("data", data)
r = session.post("http://127.0.0.1:5000/api/order", data = data)
print("r", r)

服务端接收为,很显然变形了

1
<MultiDictProxy('table': '1', 'list': 'id', 'list': 'name', 'list': 'count', 'list': 'price', 'list': 'id', 'list': 'name', 'list': 'count', 'list': 'price')>

然后我想到的解决方法就是将list这个value转为string类型再post过来,很显然或者解决方法很简单,问题就在于怎么在服务端这边从新将这个string解释为list对象,并且回复里面的字典。谷歌之后发现这样使用python的ast模块解决这个问题非常的方便

发送将list类型的value转为list之后的字典

1
2
3
4
data = {
"table": 1,
"list": "[{'id': '1', 'name': 'pork', 'count': 1, 'price': 20}, {'id': '2', 'name': 'fish', 'count': 1, 'price': 23}]"
}

服务端这边接受和解析

1
2
3
data = await request.post()
table_num = data["table"]
food_list = ast.literal_eval(data["list"])

这样就完美解决这个问题了,可能还有其他不修改list类型更好的方法,但是我觉得就不深究了。