• FastAPI 进阶知识(七) 在Request中存储附加信息


    作者:麦克煎蛋   出处:https://www.cnblogs.com/mazhiyong/ 转载请保留这段声明,谢谢!

    在整理工程模板的时候,有一个场景是当请求过来的时候,要对请求统一进行权限验证。

    如果验证通过,那么就把验证过的用户信息附加到Request中,这样在具体的路径操作里,就可以直接使用用户信息,而不用再次查询当前用户。

    同时还有一个好处是减少了重复代码量,将以前的在路径操作部分的权限验证统一提取到中间件里实现,一次实现即可。

    最开始的尝试是想把数据附加到request.session中,但后来经过多次尝试,发现在中间件部分是无法成功的。

    后来经过查询文档,发现可以把数据附加到request.state中,从而完美的解决了这个问题。

        @app.middleware("http")
        async def process_authorization(request: Request, call_next):
            """
                在这个函数里统一对访问做权限token校验。
                1、如果是用户注册、登陆,那么不做token校验,由路径操作函数具体验证
                2、如果是其他操作,则需要从header或者cookie中取出token信息,解析出内容
                   然后对用户身份进行验证,如果用户不存在则直接返回
                   如果用户存在则将用户信息附加到request中,这样在后续的路径操作函数中可以直接使用。
            """
            start_time = time.time()
    
            # print(request.url)
            # print(request.url.path)
    
            if request.url.path == '/login' or request.url.path == '/register':
                logger.info('no jwt verify.')
            else:
                logger.info('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
  • 相关阅读:
    HDU_3496_(二维费用背包)
    HDU_3732_(多重背包)
    HDU_2079_(01背包)(dfs)
    HDU_2844_(多重背包)
    Codeforces_766_D_(并查集)
    HDU_3591_(多重背包+完全背包)
    struts2标签
    ongl 表达式
    result 相关
    struts2页面输出错误信息
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/13433214.html
Copyright © 2020-2023  润新知