Sanic中间件的一次使用以及python浅复制的实际应用

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值