30 秒完美实现 Request 中"携带"用户信息,提升 10 倍性能方案
点击python编程从入门到实践,置顶 公众号重磅 python入门资料,第一时间送达
读完需要4分钟
速读仅需 2 分钟
/ python 30 秒完美实现 Request 中"携带"用户信息,提升 10 倍性能方案 /
之前在 大型 fastapi 项目实战 靠 python 中间件解决方案涨薪了 一文中 详细的介绍了通过中间件的方式去处理请求中的一些 case,没有看过的同学建议看看。
1
背景介绍
今天我们再看一下另外一个场景:当请求过来的时候,要对请求统一进行权限验证。如果验证通过,那么就把验证过的用户信息附加到 Request 中,这样在具体的路径操作里,就可以直接使用用户信息,而不用再次查询当前用户。同时还有一个好处是减少了重复代码量,将以前的在路径操作部分的权限验证统一提取出来。今天我们通过把数据附加到 request.state 中,来解决这个问题。
2
案例实现
# -*- 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源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
DNSServer 1.0 发布,开源 Java DNS 服务器
DNSServer,开源的Java版DNS服务器,实现了RFC1035部分协议内容,目前仍然存在一些不足,但是基本的A类型记录已经可以实现了。 实现功能 - 查看DNS日志(启动本程序后将电脑的DNS服务器IP设置为127.0.0.1即可) - 设置DNS递归服务器 -添加查改DNS记录,目前支持多种DNS类型,但是只有常用的A类型记录经过测试 项目截图如下: gitee地址:https://gitee.com/648823596/dnsserver
- 下一篇
不理解 Java Steam?一步步梳理其工作方式
Java Stream 已经出现很长时间了,但很多Java程序员还是不理解它的工作方式。 不会 Stream 不要紧,我们开发的时候可以不用 Stream,但理解 Stream 是咋回事还是非常必要的,至少得能看懂别人代码中的 Steam 是吧。 下面就通过一段代码,逐条说明每行代码的含义,然后再对照一下不使用 Stream 的用法,之后就可以轻松理解 Stream 的用法了。 1. Stream 示例代码解析 这段 Stream 代码共有 5 行,下面看每一行都是什么意思。 第1行 第一行我们分成2部分来看,一是内部的 Lambda 表达式: num -> num + 4 这就是一个非常简单的方法,等价于: int xxx(int num){ return num + 4; } 传入参数 num,然后返回 +4 后的结果。 第2部分是 Stream.iterate() 方法,此方法会创建一个无限的流,第一个参数 “4” 就是流的起点,第二个参数 Lambda 表达式用来生产后续的流元素。 那么第一行联合起来的意思就是,从4开始,之后的每个流元素都是持续 “+4” 计算出来,产生...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境