آشنایی با Flask 3.0 و استفاده از Flask.context_processor()

introduction to flask 3 context processor
20 آبان 1403

سلام! امروز می‌خواهیم در مورد Flask 3.0 و به خصوص تابع context_processor صحبت کنیم. Flask که یک فریم‌ورک وب سبک و ساده برای پایتون است، در نسخه جدید خودش یعنی 3.0 یک سری قابلیت‌های جدیدی ارائه داده که یکی از آن‌ها context_processor هست. بیایید ببینیم چگونه می‌توانیم از آن استفاده کنیم.

تابع context_processor در واقع به ما این امکان را می‌دهد که متغیرها یا توابعی که برای تمام قالب‌های (template) ما مشترک هستند را تعریف کنیم. به این صورت که می‌توانیم با تعریف یک تابع در سطح اپلیکیشن خود، این متغیرها را به تمامی قالب‌ها ارسال کنیم و نیاز نباشد آن‌ها را در هر جا به صورت جداگانه تعریف کنیم.

برای مثال فرض کنید می‌خواهید به طور پیش‌فرض نام کاربر را به هر قالب ارسال کنید. به کمک context_processor این کار بسیار آسان است و به خیلی از نیازهای معمول توسعه‌دهندگان پاسخ می‌دهد.

یکی از بهترین کاربردهای context_processor این است که می‌تواند در مدیریت بهتر context اپلیکیشن کمک کند و همچنین امکان مدیریت داده‌های مشترک در مقیاس بزرگ‌تر و به صورت متمرکز را فراهم می‌کند.

حالا برای اینکه بهتر بفهمیم این قابلیت چطور کار می‌کند، بریم سراغ نوشتن یک مثال کاربردی که این مباحث را پوشش می‌دهد.


from flask import Flask, render_template

app = Flask(__name__)

@app.context_processor
def inject_user():
    return {'username': 'Ali'}

@app.route('/')
def home():
    return render_template('home.html')

if __name__ == '__main__':
    app.run(debug=True)
  

from flask import Flask, render_template
در اینجا ما ماژول‌های Flask و render_template را ایمپورت می‌کنیم که برای ساخت اپلیکیشن و رندر قالب‌ها به آن‌ها نیاز داریم.

app = Flask(__name__)
در این خط اپلیکیشن Flask خود را ایجاد می‌کنیم و نام ماژول جاری را به عنوان آرگومان پاس می‌دهیم.

@app.context_processor
ما از این دکوراتور برای تعریف یک تابع context_processor استفاده می‌کنیم که مقادیر را به قالب‌ها تزریق می‌کند.

def inject_user():
تابعی به نام inject_user تعریف می‌کنیم که یک دیکشنری حاوی اطلاعاتی که می‌خواهیم به تمام قالب‌ها ارسال کنیم را برمی‌گرداند.

return {'username': 'Ali'}
این تابع یک دیکشنری با نام کاربری Ali برمی‌گرداند که به تمام قالب های ما دسترسی دارد.

@app.route('/')
مسیر '/' را به روت home تخصیص می‌دهیم.

def home():
تابع home را تعریف می‌کنیم که قرار است قالب home.html را رندر کند.

return render_template('home.html')
در اینجا قالب home.html را با داده‌هایی که تعریف کردیم رندر می‌کنیم.

if __name__ == '__main__':
این شرط بررسی می‌کند که آیا این اسکریپت اصلی است که اجرا می‌شود یا خیر.

app.run(debug=True)
اپلیکیشن را در حالت debug اجرا می‌کنیم که به ما اجازه مشاهده خطاها و اطلاعات مفید دیگر را در کنسول می‌دهد.

سوالات متداول

؟

چرا باید از context_processor در Flask استفاده کنیم؟

؟

چطور می‌توانم اطلاعات بیشتری به قالب بفرستم؟

؟

آیا می‌توان از بیش از یک context_processor استفاده کرد؟