本项目主要技术点:
- rest api
- JWT认证
- 基于flask_sqlalchemy的用户权限五表设计
- 基于flasgger的swagger文档实践
- supervisor+uwsgi+Flask项目部署实践
项目结构
conf
: supervisor和uwsgi的配置文件,后边在项目部署篇会详细讲解
src
:项目源码目录
app
:项目应用目录api
:路由forms
:表单验证models
:数据库模型utils
:通用模块
migrations
:数据库迁移目录:自动生成tests
:测试文件
manage.py
:服务启动、数据库迁移、数据库初始化
服务应用配置
项目全局配置在app
模块中的config.py
,详细配置说明看下面注释即可:
# 系统配置
from datetime import timedelta
APP_NAME = 'XXX服务'
# -------------------数据库配置-------------------
# 数据库配置:sqlite
# DB_URI = 'sqlite:///../flask_api.db'
# 数据库配置:mysql
USER = 'root'
PASSWORD = '123456'
HOST = 'localhost'
DB_NAME = 'flask_api'
DB_URI = f'mysql+pymysql://{USER}:{PASSWORD}@{HOST}/{DB_NAME}?charset=utf8'
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False
# -------------------数据库配置-------------------
# -------------------Swagger-------------------
SWAGGER_CONFIG = {
"title": f"{APP_NAME} API",
"description": f"欢迎使用 {APP_NAME}",
"termsOfService": "",
"headers": [
],
"specs": [
{
"endpoint": 'api',
"route": '/api.json',
"rule_filter": lambda rule: True, # all in
"model_filter": lambda tag: True, # all in
}
],
"static_url_path": "/flasgger_static",
# "static_folder": "static", # must be set by user
"swagger_ui": True,
"specs_route": "/apidocs/",
"securityDefinitions": {
"api_key": {
"type": "apiKey",
"in": "header",
# jwt认证
"name": "Authorization"
}
},
}
# -------------------Swagger-------------------
# -------------------JWT-------------------
SECRET_KEY = "\x17wQ;\x0b\xbc4lj\xc2;$\xfc\x96$\xbc\x9e<\x07\x93\x97\x85S\x89G&\xfe\x97\xf8\x85Ip"
JWT_SECRET_KEY = SECRET_KEY
JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=1) # 过期时间
# -------------------JWT-------------------
数据库迁移
运行sh init_db.sh
进行数据库迁移,init_db.sh
内容如下:
其中init_db
为自定义命令:初始化超级管理员用户、初始化权限、初始化普通用户角色
# 数据库迁移
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
#初始化数据库
python manage.py init_db
创建app
app中__init__.py
中创建create_app
函数,进行app的初始化配置,包括全局配置、swagger文档、跨域、全局异常、JWT、初始化数据库、蓝图注册等:
def create_app():
from . import config
# 创建Flask实例
app = Flask(__name__)
# 配置项
app.config.from_object(config)
# swagger 文档
Swagger(app, config=config.SWAGGER_CONFIG)
# 跨域支持
CORS(app)
# 初始化全局异常
init_exception(app)
# 初始化JWT
init_jwt(app)
# 初始化数据库
init_db(app)
# 注册蓝图
register_blueprints(app)
return app
manage.py
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager, Server
from app import create_app
from app.models.base import db
app = create_app()
manager = Manager(app)
migrate = Migrate(app, db)
@manager.command
def init_db():
...
manager.add_command("runserver", Server(use_debugger=True))
# 数据库迁移
# 1. python manage.py db init
# 2. python manage.py db migrate
# 3. python manage.py db upgrade
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
服务启动:
python manage.py runserver
访问http://127.0.0.1:5000/apidocs/
可测试项目的所有api文档:
项目源码地址会附在专栏最后一章,欢迎继续阅读本专栏。