2017-03-12 2 views
5

Ich definiere meine Flask-Anwendung mit dem App-Factory-Muster. Bei Verwendung von Flask-Script kann ich die Factory-Funktion an die Manager übergeben. Ich möchte stattdessen Flasks integrierten CLI CLI verwenden. Wie verwende ich die Fabrik mit Click?Verwenden Sie Flask's Click CLI mit dem App-Factory-Muster

Mein aktueller Code verwendet Flask-Script. Wie mache ich das mit 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() 

Antwort

6

Der flask Befehl ist ein Click-Schnittstelle mit flask.cli.FlaskGroup erstellt. Erstellen Sie Ihre eigene Gruppe und übergeben Sie ihr die Werksfunktion. Verwenden Sie app.shell_context_processor, um Objekte zur Shell hinzuzufügen.

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() 

Führen Sie Ihre Datei anstelle des Befehls flask aus. Sie erhalten die Click-Oberfläche mit Ihrer Fabrik.

FLASK_DEBUG=1 python app.py run 

Idealerweise einen Einstiegspunkt erstellen und Ihr Paket in Ihrem env installieren. Dann können Sie das Skript als Befehl aufrufen. Erstellen Sie eine setup.py Datei mit mindestens folgenden.

project/ 
    app/ 
     __init__.py 
    setup.py 
from setuptools import setup, find_packages 

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

Ihre eigene CLI ist weniger robust als das eingebaute in flask Befehl. Da Ihr Objekt cli mit Ihrem anderen Code definiert ist, führt ein Fehler auf Modulebene zum Fehlschlagen des Neuladeprogramms, da das Objekt nicht mehr importiert werden kann. Der Befehl flask ist von Ihrem Projekt getrennt, so dass er nicht von Fehlern in Ihrem Modul betroffen ist.

Verwandte Themen