使用Flask的Click CLI和app工厂模式

use*_*834 8 python command-line-interface flask flask-script python-click

我使用app工厂模式定义我的Flask应用程序.使用Flask-Script时,我可以将工厂函数传递给Manager.我想改用Flask的内置Click CLI.如何使用Click工厂?

我当前的代码使用Flask-Script.如何使用Click执行此操作?

from flask import Flask
from flask_script import Manager, Shell

def create_app():
    app = Flask(__name__)
    ...
    return app

manager = Manager(create_app)

def make_shell_context():
    return dict(app=app, db=db, User=User, Role=Role)

manager.add_command('shell', Shell(make_context=make_shell_context))

if __name__ == '__main__':
    manager.run()
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 10

flask命令是使用创建的Click接口flask.cli.FlaskGroup.创建自己的组并将其传递给工厂函数.用于app.shell_context_processor向shell添加对象.

from flask import Flask
from flask.cli import FlaskGroup
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app(script_info=None):
    app = Flask(__name__)
    db.init_app(app)
    ...

    @app.shell_context_processor
    def shell_context():
        return {'app': app, 'db': db}

    return app

cli = FlaskGroup(create_app=create_app)

@cli.command
def custom_command():
    pass

if __name__ == '__main__':
    cli()
Run Code Online (Sandbox Code Playgroud)

运行您的文件而不是flask命令.您将使用工厂获得Click界面.

FLASK_DEBUG=1 python app.py run
Run Code Online (Sandbox Code Playgroud)

理想情况下,创建一个入口点并在您的环境中安装您的包.然后,您可以将脚本作为命令调用.创建setup.py至少包含以下内容的文件.

project/
    app/
        __init__.py
    setup.py
Run Code Online (Sandbox Code Playgroud)
from setuptools import setup, find_packages

setup(
    name='my_app',
    version='1.0.0',
    packages=find_packages(),
    entry_points={
        'console_scripts': [
            'app=app:cli',
        ],
    },
)
Run Code Online (Sandbox Code Playgroud)
pip install -e /path/to/project
FLASK_DEBUG=1 app run
Run Code Online (Sandbox Code Playgroud)

使用您自己的CLI不如内置flask命令强大.由于您的cli对象是使用其他代码定义的,因此模块级错误将导致重新加载器失败,因为它无法再导入该对象.该flask命令与您的项目是分开的,因此它不受模块中错误的影响.