کارخانه برنامه ها

اگر از قبل از بسته‌ها و طرح‌های اولیه برای برنامه خود استفاده می‌کنید ( Modular Applications with Blueprints ) چند راه واقعاً خوب برای بهبود بیشتر تجربه وجود دارد. یک الگو زمانی برنامه ایجاد شی است که طرح اولیه وارد می شود. اما اگر ایجاد این شی را به یک تابع منتقل کنید، بعداً می توانید چندین نمونه از این برنامه را ایجاد کنید.

پس چرا می خواهید این کار را انجام دهید؟

  1. آزمایش کردن. می توانید نمونه هایی از برنامه را با تنظیمات مختلف برای آزمایش هر مورد داشته باشید.

  2. نمونه های متعدد. تصور کنید می خواهید نسخه های مختلف یک برنامه را اجرا کنید. البته، می‌توانید چندین نمونه با پیکربندی‌های مختلف در وب سرور خود تنظیم کنید، اما اگر از کارخانه‌ها استفاده می‌کنید، می‌توانید چندین نمونه از یک برنامه را در یک فرآیند برنامه اجرا کنید که می‌تواند مفید باشد.

پس چگونه واقعاً آن را اجرا می کنید؟

کارخانه های اساسی

ایده، راه‌اندازی برنامه در یک تابع است. مانند این:

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)

    from yourapplication.model import db
    db.init_app(app)

    from yourapplication.views.admin import admin
    from yourapplication.views.frontend import frontend
    app.register_blueprint(admin)
    app.register_blueprint(frontend)

    return app

نکته منفی این است که نمی توانید در زمان وارد کردن از شی برنامه از طرح های اولیه استفاده کنید. با این حال می توانید از درون یک درخواست از آن استفاده کنید. چگونه با کانفیگ به برنامه دسترسی پیدا می کنید؟ استفاده از current_app

from flask import current_app, Blueprint, render_template
admin = Blueprint('admin', __name__, url_prefix='/admin')

@admin.route('/')
def index():
    return render_template(current_app.config['INDEX_TEMPLATE'])

در اینجا نام یک قالب را در پیکربندی جستجو می کنیم.

کارخانه ها و افزونه ها

ترجیحاً افزونه ها و کارخانه‌های برنامه خود را ایجاد کنید تا شیء افزونه در ابتدا به برنامه متصل نشود.

به عنوان مثال با استفاده از <https://flask-sqlalchemy.palletsprojects.com/>`_ ، شما نباید کاری را در این خط انجام دهید:

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)

    db = SQLAlchemy(app)

اما، به جای آن، در model.py (یا معادل) اینکار را انجام دهید:

db = SQLAlchemy()

و در application.py (یا معادل آن) اینکار را انجام دهید:

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)

    from yourapplication.model import db
    db.init_app(app)

با استفاده از این الگوی طراحی، هیچ حالت خاص برنامه در شیء افزونه ذخیره نمی شود، بنابراین یک شیء افزونه را می توان برای چندین برنامه استفاده کرد. برای اطلاعات بیشتر در مورد طراحی افزونه ها به توسعه افزونه فلاسک مراجعه کنید.

با استفاده از برنامه های کاربردی

برای اجرای چنین برنامه ای می توانید از دستور flask استفاده کنید:

$ flask --app hello run

Flask will automatically detect the factory if it is named create_app or make_app in hello. You can also pass arguments to the factory like this:

$ flask --app hello:create_app(local_auth=True) run

Then the create_app factory in myapp is called with the keyword argument local_auth=True. See Command Line Interface for more detail.

بهبود کارخانه

عملکرد کارخانه بالا خیلی هوشمندانه نیست، اما می توانید آن را بهبود ببخشید. تغییرات زیر برای پیاده سازی سراست‌تر است:

  1. امکان رد کردن مقادیر پیکربندی برای تست های واحد را فراهم کنید تا مجبور نباشید فایل های پیکربندی را در سیستم فایل ایجاد کنید.

  2. هنگامی که برنامه در حال راه اندازی است، یک تابع را از یک طرح فراخوانی کنید تا جایی برای تغییر ویژگی های برنامه (مانند قلاب کردن کنترل کننده های درخواست قبل/بعد و غیره) داشته باشید.

  3. در صورت لزوم، زمانی که برنامه در حال ایجاد است، میان افزارهای WSGI را اضافه کنید.