FastAPI是一个用于构建API的现代、快速(高性能)Web框架,使用Python3.6+并基于标准Python类型提示。主要特点:快速:与NodeJS和Go相当的高性能(感谢Starlette和Pydantic)。最快的PythonWeb框架之一。高效编码:将功能开发速度提高约200%至300%。错误更少:人为(开发人员)引起的错误减少了约40%。智能:出色的编辑器支持。处处都可以自动完成,减少调试时间。简单:旨在易于使用和学习,减少阅读文档所花费的时间。简短:最小化代码重复。通过不同的参数声明实现丰富的功能。更少的错误。健壮:生成可用级别的代码。还有自动生成的交互式文档。标准化:基于(并完全兼容)API的相关开放标准:OpenAPI(以前称为Swagger)和JSONSchema。上面一段是FastAPI官方文档的介绍。通过自己的使用,我发现虽然效率提升没有官方说的那么高,但是确实会快很多,而且我觉得这个框架的代码写的比较pythonic。如果你习惯了,写其他Python代码的时候,也比较规范。熟悉Flask的人可能会更快上手FastAPI。一个py脚本就可以搭建一个网站,但是我们在开发项目的时候,肯定不会把所有的逻辑都放在一个脚本里,所以我们需要提供一个类似Django的完整的项目框架,业务开发只需要根据到固定规则。虽然官方提供了项目框架模板,但是由于FastAPI的自由度比较高,大家可以根据自己的习惯实现一个项目框架。我根据自己使用Django的习惯实现了一个自己认为比较合适的框架结构。以下是一般性介绍。介绍使用FastAPI+MySql+Tortoise-orm作为主要的数据库操作,项目结构参考了GitHub上的两个项目:CoderCharm/fastapi-mysql-generatorFastAPI-demofunctionJWTtokenauthentication。使用Tortoise-orm模型(MySql)。基于Casbin的权限验证。loguru日志模块使用权限控制进行登录、注册,routes中包含openapi的接口不进行登录和权限认证。asyncdefjwt_authentication(request:Request,x_token:str=Header(None,title='LoginToken',description='登录、注册、开放API不需要该参数')):"""开放API、登录、注册除外,所有其他的都需要身份验证:paramrequest::return:"""if'openapi'inrequest.url.path.lower()or\'login'inrequest.url.path.lower()or\'register'inrequest.url。path.lower():returnNone....全局登录认证(除上述接口外,其他接口均进行登录认证)app=FastAPI(debug=settings.DEBUG,title=settings.TITLE,description=settings.DESCRIPTION,docs_url=settings.DOCS_URL,redoc_url=settings.REDOC_URL,dependencies=[Depends(jwt_authentication)])GlobalDepends(jwt_authentication)依赖注入接口权限认证首先通过@router的auth/add和auth/del接口进行权限配置。get("/info",summary="获取当前用户信息",name="获取当前用户信息",response_model=schema.UserOut,response_model_exclude_unset=True,dependencies=[Depends(Authority('user,check'))])添加Depends(Authority('user,check')到接口))依赖注入确定权限操作权限认证在接口中进行特殊的权限认证,只需要使用check_authority函数判断,如果没有权限则抛出异常wawitcheck_authority(f'{request.state.user.username},auth,add')Configuration配置文件:core/config/development_config.py和production_config.py修改API文档的默认地址为了通过权限认证,修改API文档的地址为包含openapi的URL#文档地址默认为docsDOCS_URL:str="/openapi/docs"#文档关联请求数据接口OPENAPI_URL:str="/openapi/openapi.json"#redoc文档REDOC_URL:Optional[str]="/openapi/redoc"超级管理员给超级管理员设置用户角色为super://root:123456@127.0.0.1:3306/testdb'},'apps':{'models':{#设置数据库连接键值为"default"'default_connection':'default','models':['apps.user.model','auth.casbin_tortoise_adapter']}}}数据库使用Tortoise-orm库,因为我一直在用Django,Django有自己的一套ORM模型操作,比较方便熟悉使用,很多人用sqlalchemy,我觉得这样不方便,而Tortoise-orm是借用DjangoORM异步数据库操作库实现的,对使用Django的人比较友好#进入项目目录pipenvinstall#进入虚拟环境pipenvshell#运行服务器pythonrun.py【编者推荐】虚拟服务器管理的6个优秀实践2021年引领软件开发行业发展的15个技术趋势不错,这就是我详细看到的关于SpringCloud微服务架构|附面试题有中国三大电信运营商,纽交所,被退市赔钱?
