重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇内容主要讲解“如何用python实现Request中"携带"用户信息”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用python实现Request中"携带"用户信息”吧!
目前创新互联已为1000多家的企业提供了网站建设、域名、网站空间、网站运营、企业网站设计、秀洲网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
读完需要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实现Request中"携带"用户信息”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!