作者:麦克煎蛋 出处: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中直接取出用户基础信息。
这样既方便了权限的统一控制,又减少了代码重复。
来源:oschina
链接:https://my.oschina.net/u/4339343/blog/4523840