Faragiri
فارسی

زبان را انتخاب کنید ۲

همهٔ زبان‌ها

آموزش پایتون در وب پایتون

سی سطر بدون هیچ فریم‌ورکی، همان کاری را می‌کند که جنگو و فلسک: مسیر را نگاه می‌کند، جواب می‌سازد، و یک کد وضعیت برمی‌گرداند.

۴بخش
۳دقیقه خواندن
۴عمق

یک درخواست، شش ایستگاه

از سطر درخواست تا بایت‌هایی که برمی‌گردند

هر ایستگاه یک تصمیم است و هر تصمیم می‌تواند همان‌جا پاسخ بدهد و بقیه مسیر را رد کند.

  1. سطر درخواستروش و مسیر و رشته پرس‌وجو، که سرور در یک دیکشنری می‌گذارد
  2. تطبیق مسیرمقایسه با یک رشته اینجا، و یک جدول الگو در یک فریم‌ورک
  3. باز کردن پرس‌وجوهر کلید می‌تواند چند بار آمده باشد، پس جواب یک فهرست است
  4. پیدا کردن دادهیک دیکشنری اینجا، و یک کوئری در برنامه واقعی
  5. انتخاب وضعیتنبودن منبع و بد بودن درخواست دو عدد جدا هستند
  6. سرآیند و بدنهطول بدنه باید با بایت‌های واقعی بخواند، نه با تعداد نویسه‌ها

این مسیر یک درخواست موفق را می‌کشد. مسیر خطا از هر ایستگاهی می‌تواند شروع شود و کوتاه‌تر است، و همان است که در بیشتر برنامه‌ها آزموده نشده باقی می‌ماند.

پیش از یاد گرفتن هر فریم‌ورکی، یک بار همان کار را بدون فریم‌ورک ببینید. کتابخانه استاندارد پایتون خودش یک سرور دارد و قراردادی که همه فریم‌ورک‌های پایتون رویش نشسته‌اند: یک تابع که دو چیز می‌گیرد و بایت برمی‌گرداند.

یک درخواست واقعی به همین تابع، با سرور wsgiref که همراه پایتون می‌آید:

  • درخواست: GET /mojoodi?kod=PL-14
  • وضعیت: 200 OK
  • سرآیندها: {'Content-Type': 'application/json', 'Content-Length': '30'}
  • بدنه: {"kod": "PL-14", "mojoodi": 3}

کل کاری که تابع کرد این بود: مسیر را با یک رشته مقایسه کرد، پرس‌وجو را با parse_qs باز کرد، در یک دیکشنری دنبال کد گشت، و اگر نبود پاسخ را با وضعیت "404 Not Found" فرستاد. جنگو و فلسک همین‌اند، با یک جدول مسیر به‌جای آن if و با ابزارهایی که کارهای تکراری را حذف می‌کنند.

سه چیزی که فریم‌ورک واقعا می‌دهد

مسیریابی با الگو، یعنی /mojoodi/<kod> که خودش بخش متغیر را جدا می‌کند و به تابع پاس می‌دهد. لایه پایگاه داده، که سطر را به شی تبدیل می‌کند و کوئری را می‌سازد. و مهم‌تر از هر دو، مجموعه‌ای از پیش‌فرض‌های امنیتی: توکن ضدجعل روی فرم‌ها، فرار دادن خودکار در قالب‌ها، و مدیریت نشست. نوشتن این سه با دست ممکن است و اشتباه کردن در سومی گران است.

تفاوت جنگو و فلسک هم در همین‌جاست و نه در سرعت: جنگو هر سه را از روز اول دارد و فلسک اجازه می‌دهد هرکدام را جدا انتخاب کنید. برای یک سرویس کوچک که فقط چند مسیر دارد، فلسک کد کمتری می‌خواهد؛ برای چیزی که پنل مدیریت و کاربر و مجوز دارد، نوشتن دوباره آن‌ها روی فلسک همان جنگوست با کیفیت کمتر.

وضعیت‌ها را جدی بگیرید

سه عددی که بیشتر اشتباه می‌شوند: ۴۰۴ یعنی این منبع وجود ندارد، ۴۰۰ یعنی درخواست شما بد بود، و ۵۰۰ یعنی کد ما شکست. برگرداندن ۲۰۰ با یک پیام خطا داخل بدنه، رایج‌ترین اشتباه است و هر مصرف‌کننده‌ای را مجبور می‌کند بدنه را بخواند تا بفهمد موفق بوده یا نه. قرارداد کاملش در منبع، فعل، و کد وضعیت است.

جایی که کار گیر می‌کند، لحظه استقرار است

سروری که پایتون همراه خودش دارد برای توسعه است و برای محیط واقعی نیست: تک‌نخی است، هیچ محدودیتی روی اندازه درخواست ندارد و در برابر خطا شکننده است. آنچه در عمل اجرا می‌شود یک سرور برنامه مثل gunicorn است که چند فرایند کارگر بالا می‌آورد، و پشت آن یک وب‌سرور که فایل‌های ثابت را خودش می‌دهد. تازه‌کارها معمولا این را نمی‌دانند و برنامه‌ای که ماه‌ها روی لپ‌تاپ عالی کار می‌کرد اولین روز روی سرور زیر چند درخواست هم‌زمان می‌ایستد. تعداد کارگرها هم به حافظه سرور بسته است و نه به تعداد کاربران، که روی سرورهای ارزان یک گیگابایتی معنی‌اش این است که عدد پیش‌فرض معمولا زیاد است.

ابزار، و سالی که این حرف درست است

در سال ۲۰۲۶، جنگو انتخاب پیش‌فرض برای برنامه‌ای است که پنل مدیریت و کاربر دارد، متن‌باز و رایگان است، و پنل مدیریت آماده‌اش چیزی است که هیچ فریم‌ورک دیگری معادلش را ندارد. فلسک برای سرویس‌های کوچک و متن‌باز است. برای رابط‌های برنامه‌نویسی جدید، FastAPI از همان حاشیه‌نویسی نوع، اعتبارسنجی ورودی و مستندات تعاملی را می‌سازد و جای نوشتن دستی هر دو را گرفته؛ هر سه از مخزن بسته‌ها نصب می‌شوند.

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

کنار این

بالای این