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

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

 

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

在测试环境和生产环境都通过了实际测试,我的认为能够实际应用于正式环境了。sql

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

工程目录结构

├── 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,经过中间件的方式进行统一鉴权。cookie

@app.middleware("http") async def process_authorization(request: Request, call_next): """ 在这个函数里统一对访问作权限token校验。 一、若是是用户注册、登录,那么不作token校验,由路径操做函数具体验证 二、若是是其余操做,则须要从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中直接取出用户基础信息。app

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

相关文章
相关标签/搜索