کارخانه برنامه ها¶
اگر از قبل از بستهها و طرحهای اولیه برای برنامه خود استفاده میکنید ( Modular Applications with Blueprints ) چند راه واقعاً خوب برای بهبود بیشتر تجربه وجود دارد. یک الگو زمانی برنامه ایجاد شی است که طرح اولیه وارد می شود. اما اگر ایجاد این شی را به یک تابع منتقل کنید، بعداً می توانید چندین نمونه از این برنامه را ایجاد کنید.
پس چرا می خواهید این کار را انجام دهید؟
آزمایش کردن. می توانید نمونه هایی از برنامه را با تنظیمات مختلف برای آزمایش هر مورد داشته باشید.
نمونه های متعدد. تصور کنید می خواهید نسخه های مختلف یک برنامه را اجرا کنید. البته، میتوانید چندین نمونه با پیکربندیهای مختلف در وب سرور خود تنظیم کنید، اما اگر از کارخانهها استفاده میکنید، میتوانید چندین نمونه از یک برنامه را در یک فرآیند برنامه اجرا کنید که میتواند مفید باشد.
پس چگونه واقعاً آن را اجرا می کنید؟
کارخانه های اساسی¶
ایده، راهاندازی برنامه در یک تابع است. مانند این:
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.
بهبود کارخانه¶
عملکرد کارخانه بالا خیلی هوشمندانه نیست، اما می توانید آن را بهبود ببخشید. تغییرات زیر برای پیاده سازی سراستتر است:
امکان رد کردن مقادیر پیکربندی برای تست های واحد را فراهم کنید تا مجبور نباشید فایل های پیکربندی را در سیستم فایل ایجاد کنید.
هنگامی که برنامه در حال راه اندازی است، یک تابع را از یک طرح فراخوانی کنید تا جایی برای تغییر ویژگی های برنامه (مانند قلاب کردن کنترل کننده های درخواست قبل/بعد و غیره) داشته باشید.
در صورت لزوم، زمانی که برنامه در حال ایجاد است، میان افزارهای WSGI را اضافه کنید.