• 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

    最后效果:

      

  • 相关阅读:
    投影变换 到 uv坐标 xy/w 齐次坐标
    GdiPlus[19]: IGPPathGradientBrush 之 SetCenterPoint
    GdiPlus[21]: IGPPathGradientBrush 之 InterpolationColors
    GdiPlus[24]: IGPPrivateFontCollection: 分别从文件和内存加载字体
    GdiPlus[23]: IGPFontFamily
    GdiPlus[25]: IGPInstalledFontCollection: 获取已安装的字体列表
    GdiPlus[20]: IGPPathGradientBrush 之 SetFocusScales
    GdiPlus[22]: IGPFont
    可爱的 CreateMessageDialog
    GdiPlus[18]: IGPPathGradientBrush 之 CenterColor、SurroundColors
  • 原文地址:https://www.cnblogs.com/-wenli/p/15144463.html
Copyright © 2020-2023  润新知