Sanic中间件的一次使用以及浅复制的实际应用
关于Sanic中间件的一次使用报错及debug
前情提要
开发的接口有个需求,需要把传参内容里面的int型key的dict,改成str型key。由于接口已经写的七七八八,每个都重新改有点不现实,所以想着用一个中间件去做,刚好Sanic本身也有中间件。
Sanic中间件的官方文档点这里
中间件代码如下
@app.middleware("request")
async def change_int_key_to_str(request):
try:
body = request.form
item = body.get('props')
if item:
item = eval(item)
if isinstance(item, dict):
new_item = {
}
for k in item:
new_item[str(k)] = item[k]
body['props'] = new_item
elif isinstance(item, list):
pass
else:
raise SyntaxError
request.form = body # 最开始的想法时改完参数再把原先的替换掉
except Exception as e:
print(traceback.format_exc()) # 输出捕捉的异常的traceback
由于部分字段在不同接口传的参数会有不同,所以做了type
判定,以兼容所有接口。这里我用了eval
,为了预防错误传参,如果既不是dict
也不是list
,就直接raise一个SyntaxError
让except捕捉做异常处理。
部分接口代码如下
@app.route("/api/test", methods=['POST'])
async def test(request):
body = request.form
did = body.get("did")
props = body.get("props")
POSTMAN传参如下
结果
果不其然:报错了,而且报错信息有点长。
[2021-04-04 15:07:31 +0800] [10829] [INFO] Starting worker [10829]
Traceback (most recent call last):
File "/Users/vivi/Desktop/all_code/middleware_test.py", line 23, in change_int_key_to_str
request.form = body
AttributeError: can't set attribute
[2021-04-04 15:07:33 +0800] [10829] [ERROR] Exception occurred while handling uri: 'http://localhost:8000/api/test'
Traceback (most recent call last):
File "/Users/vivi/opt/miniconda3/envs/py35/lib/python3.5/site-packages/sanic/app.py", line 917, in handle_request
response = await response
File "/Users/vivi/opt/miniconda3/envs/py35/lib/python3.5/asyncio/coroutines.py", line 109, in __next__
return self.gen.send(None)
File "/Users/vivi/Desktop/all_code/middleware_test.py", line 32, in test
props = body.get