zoukankan      html  css  js  c++  java
  • 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中直接取出用户基础信息。

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

  • 相关阅读:
    《需求工程-软件建模与分析之读书笔记之五》
    Neo4j (3.3.9)的学习之路(1)
    大数据培训第一天总结
    京东B2B业务架构演变阅读心得
    小米网抢购系统开发实践阅读心得
    余额宝技术架构及演进阅读心得
    美图数据统计分析平台架构演进阅读心得
    荔枝架构实践与演进历程阅读心得
    去哪儿网支付系统架构演进全历程阅读心得
    基于SOA质量属性的系统构架分析与实践
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/13446743.html
Copyright © 2011-2022 走看看