2017-03-12 48 views
5

ile CLI'yı tıkla Uygulama tasarım desenini kullanarak Flask uygulamamı tanımlarım. Flask-Script'i kullanırken fabrika işlevini Manager'a geçirebilirim. Flask'ın yerleşik Click CLI'sini kullanmak istiyorum. Fabrika'yı Click ile nasıl kullanırım?Flask'in Uygulamanın fabrika modeli

Geçerli kodum Flask-Script kullanıyor. Bunu Click ile nasıl yapabilirim?

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

cevap

6

flask komut flask.cli.FlaskGroup ile oluşturulan bir Click arayüzüdür. Kendi grubunuzu oluşturun ve fabrika işlevini iletin. Kabuklara nesne eklemek için app.shell_context_processor kullanın.

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

dosyanızı yerine flask komutunu çalıştırın. Tıklama arayüzünü fabrikanızı kullanarak alacaksınız.


FLASK_DEBUG=1 python app.py run 

İdeal olarak, bir giriş noktası oluşturmak ve env'deki paketinizi yükleyin. Ardından komut dosyasını komut olarak arayabilirsiniz. En az aşağıdaki ile bir setup.py dosyası oluşturun. Kendi CLI Kullanarak
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 

project/ 
    app/ 
     __init__.py 
    setup.py 
daha az sağlamdır yerleşik flask komuta. cli nesneniz diğer kodunuzla tanımlandığından, modül düzeyinde bir hata, yeniden yükleyicinin artık nesneyi içe aktaramayacağı için başarısız olmasına neden olur. flask komutu projenizden ayrıdır, bu nedenle modülünüzdeki hatalardan etkilenmez.