Use Flask's Click CLI with the app factory pattern

前端 未结 2 1616
南旧
南旧 2020-12-30 09:44

I define my Flask application using the app factory pattern. When using Flask-Script, I can pass the factory function to the Manager. I\'d like to use Flask\'s

2条回答
  •  庸人自扰
    2020-12-30 10:02

    In order to pass arguments to your app factory, you need to make use of script_info like so...

    manage.py

    #!/usr/bin/env python
    
    import click
    import config
    
    from flask import Flask
    from flask.cli import FlaskGroup, pass_script_info
    
    
    def create_app(script_info):
        app = Flask(__name__)
    
        if script_info.config_mode:
            obj = getattr(config, script_info.config_mode)
            flask_config.from_object(obj)
    
        ...    
        return app
    
    
    @click.group(cls=FlaskGroup, create_app=create_app)
    @click.option('-m', '--config-mode', default="Development")
    @pass_script_info
    def manager(script_info, config_mode):
        script_info.config_mode = config_mode
    
    
    if __name__ == "__main__":
        manager()
    

    config.py

    class Config(object):
        TESTING = False
    
    class Production(Config):
        DATABASE_URI = 'mysql://user@localhost/foo'
    
    class Development(Config):
        DATABASE_URI = 'sqlite:///app.db'
    
    class Testing(Config):
        TESTING = True
        DATABASE_URI = 'sqlite:///:memory:'
    

    now in the command line you can do manage -m Production run (after either adding the entry_points to setup.py as @davidism mentioned, or running pip install manage.py).

提交回复
热议问题