点击python编程从入门到实践,置顶 公众号重磅 python入门资料,第一时间送达python
读完须要4分钟面试
速读仅需 2 分钟编程
/ python 30 秒完美实现 Request 中"携带"用户信息,提高 10 倍性能方案 /api
以前在 大型 fastapi 项目实战 靠 python 中间件解决方案涨薪了 一文中 详细的介绍了经过中间件的方式去处理请求中的一些 case,没有看过的同窗建议看看。微信
1cookie
背景介绍闭包
今天咱们再看一下另一个场景:当请求过来的时候,要对请求统一进行权限验证。若是验证经过,那么就把验证过的用户信息附加到 Request 中,这样在具体的路径操做里,就能够直接使用用户信息,而不用再次查询当前用户。同时还有一个好处是减小了重复代码量,将之前的在路径操做部分的权限验证统一提取出来。今天咱们经过把数据附加到 request.state 中,来解决这个问题。并发
2app
案例实现async
# -*- coding: utf-8 -*-import time@app.middleware("http")async def process_authorization(request: Request, call_next): """ 在这个函数里统一对访问作权限 token 校验。 1.若是是用户注册、登录,那么不作 token 校验,由路径操做函数具体验证 2.若是是其余操做,则须要从 header 或者 cookie 中取出 token 信息,解析出内容而后对用户身份进行验证, 2.1.若是用户不存在则直接返回 2.2.若是用户存在则将用户信息附加到 request 中,这样在后续的路径操做函数中能够直接使用。 """ start_time = time.time() if request.url.path == '/login' or request.url.path == '/register': # 是登录或者注册的路由则直接经过 logger.info('not need jwt verify, please do next task') else: logger.info('need jwt verify.') result = Auth.identifyAll(request) if result['status'] and result['data']: user = result['data']['user'] logger.info('jwt verify success. user: %s ' % user.username) # state 中记录用户基本信息 request.state.user = user else: return JSONResponse(content=result) # 进行接下来的操做处理 response = await call_next(request) process_time = time.time() - start_time response.headers["X-Process-Time"] = str(process_time) return response
几点说明:
1.本案例中的方式其实质仍是经过中间件的方式先拦截掉请求再附加信息进行处理,须要看清本质
2.咱们会想一下是否在本身作过的系统中先是把请求放进来 而后在获取具体与人属性相关的信息的时候,是否都是先进行查询人属性的信息,而后基于此再作接下来的处理,那可否借鉴本案例中的方法进行处理呢?这个问题留给你们进行思考。至于标题中说到的提高 10 倍性能,这个对比基准不一样测试获得的效果也有差别,请理性看待
3.若对中间件感兴趣的同窗建议结合以前的一篇参照着来学习效果更佳,面试过程当中发现不少同窗一问都用过中间件,但本身没怎么自定义过中间件,这是否是值得思考呢?
我坚信:思考问题的方法远大于具体解决问题的方案,让咱们继续一路前行,下期再见!
原创不易,只愿能帮助那些须要这些内容的同行或刚入行的小伙伴,你的每次 点赞、分享 都是我继续创做下去的动力,我但愿能在推广 python 技术的道路上尽我一份力量,欢迎在评论区向我提问,我都会一一解答,记得一键三连支持一下哦!
加入python学习交流微信群,请后台回复「入群」
往期推荐
大型fastapi项目实战 靠 python 中间件解决方案涨薪了
大型fastapi项目实战 高并发请求神器之aiohttp(下)
大型fastapi项目实战 高并发请求神器之aiohttp(上) [建议收藏]
本文分享自微信公众号 - python编程军火库(PythonCoder1024)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。