2017-03-12 26 views
5

के साथ फ्लास्क के क्लिक सीएलआई का उपयोग करें मैं ऐप फैक्टरी पैटर्न का उपयोग करके अपने फ्लास्क एप्लिकेशन को परिभाषित करता हूं। फ्लास्क-स्क्रिप्ट का उपयोग करते समय, मैं फैक्टरी फ़ंक्शन को Manager पर पास कर सकता हूं। मैं इसके बजाय फ्लास्क के अंतर्निहित क्लिक सीएलआई का उपयोग करना चाहता हूं। मैं कारखाने का उपयोग क्लिक के साथ कैसे करूं?एप फैक्ट्री पैटर्न

मेरा वर्तमान कोड फ्लास्क-स्क्रिप्ट का उपयोग करता है। मैं क्लिक के साथ ऐसा कैसे करूं?

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

उत्तर

6

flask आदेश flask.cli.FlaskGroup साथ बनाई गई एक क्लिक इंटरफ़ेस है। अपना खुद का समूह बनाएं और इसे फैक्ट्री फ़ंक्शन पास करें। खोल में ऑब्जेक्ट जोड़ने के लिए app.shell_context_processor का उपयोग करें।

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

flask कमांड के बजाय अपनी फ़ाइल चलाएं। आपको अपने कारखाने का उपयोग करके क्लिक इंटरफ़ेस मिल जाएगा।

FLASK_DEBUG=1 python app.py run 

आदर्श रूप में, एक प्रवेश बिंदु बना सकते हैं और अपने env में अपने पैकेज स्थापित। फिर आप स्क्रिप्ट को कमांड के रूप में कॉल कर सकते हैं। कम से कम निम्नलिखित के साथ setup.py फ़ाइल बनाएं।

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 

अपनी खुद की CLI का उपयोग तरीके से कम प्रभावी है निर्मित flask आदेश। चूंकि आपके cli ऑब्जेक्ट को आपके अन्य कोड से परिभाषित किया गया है, इसलिए मॉड्यूल-स्तरीय त्रुटि से रीलोडर विफल हो जाएगा क्योंकि यह अब ऑब्जेक्ट आयात नहीं कर सकता है। flask कमांड आपके प्रोजेक्ट से अलग है, इसलिए यह आपके मॉड्यूल में त्रुटियों से प्रभावित नहीं है।

संबंधित मुद्दे