3

30 秒完美实现 Request 中"携带"用户信息,提升 10 倍性能方案

 3 years ago
source link: https://my.oschina.net/u/3699111/blog/5046451
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
30 秒完美实现 Request 中"携带"用户信息,提升 10 倍性能方案

点击python编程从入门到实践,置顶 公众号重磅 python入门资料,第一时间送达

2d35b75c-40aa-4992-b3e6-8d9b51d8cf5c.jpg

读完需要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学习交流微信群,请后台回复「入群

python生产实战 python 闭包之庖丁解牛篇

大型fastapi项目实战 靠 python 中间件解决方案涨薪了

大型fastapi项目实战 高并发请求神器之aiohttp(下)

大型fastapi项目实战 高并发请求神器之aiohttp(上) [建议收藏]

本文分享自微信公众号 - python编程军火库(PythonCoder1024)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK