Python Flask-RESTPlus 实践
Flask-RESTPlus介绍
Flask-RESTPlus是对Flask的扩展,它增加了对快速开发REST API的支持。Flask-RESTPlus中提供了大量的装饰器和工具来描述你的API,并以文档化的形式将这些接口展现出来(通过Swagger来实现)。
项目准备与配置
项目准备
python版本:3.6
项目路径:
app main controller ---API层,定义API 接口; model ---Model层,定义数据表和字段类型; serializers ---序列化与反序列化层 service ---Service层,业务逻辑层; config.py ---App应用配置 __init__.py ---App初始化 __init__.py —-API 蓝图 入口 docker ---存放dockfile文件 manage.py ---App 程序运行入口 requirements.txt ---依赖包
requirements.txt:
alembic==1.6.5 aniso8601==9.0.1 attrs==21.2.0 bcrypt==3.2.0 certifi==2021.5.30 cffi==1.14.6 charset-normalizer==2.0.4 click==7.1.2 dataclasses==0.8 Flask==1.1.4 Flask-Bcrypt==0.7.1 Flask-Migrate==2.7.0 flask-restplus==0.13.0 Flask-Script==2.0.6 Flask-SQLAlchemy==2.5.1 Flask-Testing==0.8.1 greenlet==1.1.1 idna==3.2 importlib-metadata==4.6.3 itsdangerous==1.1.0 Jinja2==2.11.3 jsonschema==3.2.0 Mako==1.1.4 MarkupSafe==2.0.1 mysql-connector-python==8.0.26 pika==1.2.0 protobuf==3.17.3 pycparser==2.20 PyJWT==2.1.0 pyrsistent==0.18.0 python-dateutil==2.8.2 python-editor==1.0.4 pytz==2021.1 requests==2.26.0 six==1.16.0 SQLAlchemy==1.4.22 typing-extensions==3.10.0.0 urllib3==1.26.6 Werkzeug==0.16.0 zipp==3.5.0
项目配置
app/main/config.py
import os basedir = os.path.abspath(os.path.dirname(__file__)) class Config: SECRET_KEY = os.getenv('SECRET_KEY', 'my_precious_secret_key') DEBUG = False class DevelopmentConfig(Config): DEBUG = True # mysql配置:mysql://username:password@hostname/database # 例如:mysql://root:root@localhost:5000/flaskdb" SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'flask_boilerplate_main.db') SQLALCHEMY_TRACK_MODIFICATIONS = False class TestingConfig(Config): DEBUG = True TESTING = True SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'flask_boilerplate_test.db') PRESERVE_CONTEXT_ON_EXCEPTION = False SQLALCHEMY_TRACK_MODIFICATIONS = False class ProductionConfig(Config): DEBUG = False config_by_name = dict( dev=DevelopmentConfig, test=TestingConfig, prod=ProductionConfig ) key = Config.SECRET_KEY
app/main/__init__.py
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_bcrypt import Bcrypt from .config import config_by_name db = SQLAlchemy() flask_bcrypt = Bcrypt() def app(config_name): app = Flask(__name__) app.config.from_object(config_by_name[config_name]) db.init_app(app) flask_bcrypt.init_app(app) return app
manage.py
import os import unittest from flask_migrate import Migrate, MigrateCommand from flask_script import Manager from app.main import app, db from app import blueprint app = app(os.getenv('BOILERPLATE_ENV') or 'dev') app.register_blueprint(blueprint) app.app_context().push() manager = Manager(app) migrate = Migrate(app, db) manager.add_command('db', MigrateCommand) @manager.command def run(): app.run() @manager.command def test(): """Runs the unit tests.""" tests = unittest.TestLoader().discover('app/test', pattern='test*.py') result = unittest.TextTestRunner(verbosity=2).run(tests) if result.wasSuccessful(): return 0 return 1 if __name__ == '__main__': manager.run()
测试运行
python manage.py run
数据库
1.、使用 init
命令创建一个迁移文件夹以使 Alembic 执行迁移。
python manage.py db init
2、使用 migrate
命令检测 model 的更改并创建迁移脚本。这里并不会更改数据库。
python manage.py db migrate --message '初始化数据库'
3、使用 upgrade
命令将迁移脚本应用于数据库。
python manage.py db upgrade
note:每次数据库模型更改时,都执行一次 migrate
和 upgrade
命令。
其他常用命令:
去查看改变的历史状态;
python manage.py db history
使用manage.py可以查看更多命令:
Swagger配置
参考git配置:https://github.com/Angell1/py-workflow
最后效果: