前言
这次系统分析与设计大作业我负责web后端开发工作,本来又想使用flask框架的,但是想想flask框架都有点审美疲劳了,而且flask框架是阻塞式框架,效率未免有点不高。所以这次我使用了异步web框架aiohttp,简单记录一下基本使用,至于框架原理之类后面再深入研究。
hello world
简单hello world代码1
2
3
4
5
6
7
8
9from 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/31
app.router.add_get("/api/order/{id}", reservation_view.get_order)
使用以下获取参数id1
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) |
使用以下获取表单data1
data = await request.post()
问题
在这次系分的后端开发过程中,遇到了一个我以前也遇到过的问题,但是我忘记了以前我是怎么解决的了。问题就是,当post的表单中有一个value值为一个list,那么服务端这边接受会这样?
上面的问题就是服务端这边接受了这个字典之后,会发现这个list的value值已经变形了,具体情况如下:
发送表单1
2
3
4
5
6
7
8
9
10
11import 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
4data = {
"table": 1,
"list": "[{'id': '1', 'name': 'pork', 'count': 1, 'price': 20}, {'id': '2', 'name': 'fish', 'count': 1, 'price': 23}]"
}
服务端这边接受和解析1
2
3data = await request.post()
table_num = data["table"]
food_list = ast.literal_eval(data["list"])
这样就完美解决这个问题了,可能还有其他不修改list类型更好的方法,但是我觉得就不深究了。