استفاده از Blueprint.url_value_preprocessor در Flask 3.0

flask Blueprint url value preprocessor
11 آذر 1403

کتابخانه Flask یکی از محبوب‌ترین چارچوب‌های وب در زبان برنامه‌نویسی پایتون است که به برنامه‌نویسان امکان می‌دهد به راحتی برنامه‌های وب سبک و کارا ایجاد کنند. یکی از مفاهیم کلیدی در Flask استفاده از الگوهای URL با استفاده از بلواپرینت‌ها (Blueprints) است که امکان ساختاردهی بهتر به برنامه را فراهم می‌کند. در Flask 3.0، روش url_value_preprocessor به شما امکان می‌دهد پیش از هر درخواست، مقادیر URL را پردازش کنید. این روش می‌تواند برای وظایفی مانند تأیید اعتبار، تغییر دادن و یا ذخیره کردن داده‌ها قبل از رسیدن به نمای صفحه مفید باشد.

هنگامی که برنامه‌های بزرگ‌تری در Flask توسعه می‌دهید، ممکن است بخواهید روندهای پیش‌پردازش خاصی برای URL‌ها در بخش‌های مختلف برنامه خود پیاده‌سازی کنید. برای مثال، اگر بخواهید همه URL‌ها را قبل از پردازش نهایی و بررسی دسترسی بررسی کنید، استفاده از Blueprint.url_value_preprocessor می‌تواند بسیار مناسب باشد. به طور کلی، این روش به شما امکان می‌دهد تا در هر مرحله نیاز به تنظیمات و پیش‌پردازش‌های خاصی را برای ورودی‌های خود انجام دهید.

در ادامه، نمونه‌ای از نحوه استفاده از Blueprint.url_value_preprocessor آورده شده است که به شما تجربه عملی از این مفهوم در برنامه Flask ارائه می‌دهد. این قطعه کد یک نمایندگی ساده کاربر ایجاد می‌کند که قبل از پردازش نهایی، مطمئن می‌شود که کاربر مورد نظر در سیستم وجود دارد یا خیر.

نمونه کد استفاده از Blueprint.url_value_preprocessor


from flask import Flask, Blueprint, request, jsonify

app = Flask(__name__)
user_blueprint = Blueprint('user', __name__, url_prefix='/user')

@user_blueprint.url_value_preprocessor
def get_user(endpoint, values):
user_id = values.pop('user_id', None)
if user_id is not None:
# فرض کنیم تابعی برای بررسی وجود کاربر داریم
user = get_user_by_id(user_id)
if user is None:
return jsonify({'error': 'User not found'}), 404
request.user = user

@user_blueprint.route('/')
def user_dashboard(user_id):
return jsonify({'message': f'Welcome, {request.user}'})

app.register_blueprint(user_blueprint)

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


from flask import Flask, Blueprint, request, jsonify
در این خط ما از بسته Flask موارد مورد نیاز مانند خود Flask، Blueprint، و ماژول‌های درخواست و پاسخ را وارد می‌کنیم.

app = Flask(__name__)
یک نمونه جدید از کلاس Flask ایجاد می‌کنیم که برنامه ما را نشان می‌دهد.

user_blueprint = Blueprint('user', __name__, url_prefix='/user')
یک بلواپرینت جدید به نام 'user' با پیشوند URL '/user' ایجاد می‌کنیم که به ما امکان می‌دهد مسیرهای مرتبط با کاربر را ساختاردهی کنیم.

@user_blueprint.url_value_preprocessor
با استفاده از این دکوراتور در Flask، تابع get_user را برای پردازش مقادیر URL قبل از فراخوانی تابع نمای پایان، تنظیم می‌کنیم.

def get_user(endpoint, values):
یک تابع به نام get_user تعریف می‌کنیم که به عنوان پردازشگر URL عمل می‌کند و مقادیر را از URL دریافت می‌کند.

user_id = values.pop('user_id', None)
سعی می‌کنیم شناسه کاربر را از مقادیر URL خارج کنیم و در صورت عدم وجود مقدار None را برگردانیم.

if user_id is not None:
بررسی می‌کنیم که آیا شناسه کاربر موجود است یا خیر.

user = get_user_by_id(user_id)
فرض بر این است که تابعی داریم که بررسی می‌کند آیا کاربری با این شناسه در سیستم وجود دارد یا خیر.

if user is None:
چک می‌کنیم که آیا کاربر وجود دارد یا خیر.

return jsonify({'error': 'User not found'}), 404
اگر کاربر وجود نداشته باشد، خطای ۴۰۴ را بازمی‌گردانیم.

request.user = user
اگر کاربر وجود داشت، آن را به درخواست اضافه می‌کنیم تا در نمای‌های دیگر قابل دسترسی باشد.

@user_blueprint.route('/')
یک مسیر جدید در بلواپرینت تعریف می‌کنیم که شناسه کاربر را به‌عنوان پارامتر ورودی دریافت می‌کند.

def user_dashboard(user_id):
یک تابع نمایش برای داشبورد کاربر ایجاد می‌کنیم.

return jsonify({'message': f'Welcome, {request.user}'})
یک پیام خوش آمدگویی که شامل نام کاربر است را برمی‌گرداند.

app.register_blueprint(user_blueprint)
این بلواپرینت را در برنامه Flask ثبت می‌کنیم تا مسیرهای آن فعال شوند.

if __name__ == '__main__':
برنامه را در وضعیت توسعه اجرا می‌کنیم تا بتوانیم رفتار آن را مشاهده کنیم.

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

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

؟

چرا باید از Blueprint.url_value_preprocessor استفاده کنم؟

؟

آیا استفاده از Blueprint.url_value_preprocessor برای همه سورس‌ها ضروری است؟

؟

می‌توانم بیش از یک url_value_preprocessor برای یک بلواپرینت داشته باشم؟

؟

چگونه می‌توانم خطاها را در url_value_preprocessor مدیریت کنم؟