随笔 - 214  文章 - 12  评论 - 40  阅读 - 38万

FastAPI 工程管理(四) 工程示例

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

 

结合前期学习的过程,整理了一份工程实例模板,在基于FastAPI框架的前提下,参考了Flask的一些业务逻辑和文件配置。

在测试环境和生产环境都经过了实际测试,个人认为可以实际应用于正式环境了。

代码地址: https://github.com/zhiyongma/fastproject

工程目录结构

复制代码
├── app
│   ├── auth           # JWT Authorization
│   ├── models         # database models
│   ├── routers        # api routers
│   └── util           # utility
│   ├── __init__.py    # entry file
│   ├── config.py      # project config
│   ├── database.py    # database 
├── deploy             # deploy tools
│   ├── gunicorn_fast.service    # service sample 
│   ├── test_user.sql            # user db sample 
├── gunicorn.py        # gunicorn config
├── local.py           # for development run
├── run.py             # for production run
复制代码

鉴权核心流程

这里参考了Flask的@app.before_request,通过中间件的方式进行统一鉴权。

复制代码
    @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
复制代码

在路径操作函数中,可以认为已经通过鉴权,并且可以从request.state.user中直接取出用户基础信息。

这样既方便了权限的统一控制,又减少了代码重复。

 

posted on   麦克煎蛋  阅读(2460)  评论(4编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示