ساخت API آمادهٔ تولید با Django REST Framework
۱۱ اردیبهشت ۱۴۰۵ · تیم XSofts · 7 دقیقه
API تمیز از معماری شروع میشود، نه از یک ViewSet شلوغ
Django REST Framework ابزار قدرتمندی است، اما قدرت آن وقتی دیده میشود که دامنهٔ کسبوکار در اپهای جدا باشد. تماس، خبرنامه، بلاگ و حساب کاربری را در یک views.py جمع نکنید. هر اپ مدل، سریالایزر، تست و url خودش را داشته باشد. سریالایزر را نازک نگه دارید: اعتبارسنجی و شکل پاسخ آنجا است، منطق کسبوکار نه.
نسخهگذاری مسیر مثل /api/v1/ تغییرات آینده را بدون شکستن کلاینت ممکن میکند. وقتی فیلد اجباری میشود یا معنای یک وضعیت عوض میشود، نسخهٔ جدید بسازید؛ فیلد اختیاری جدید را میشود در همان نسخه اضافه کرد. خدمات توسعه بکاند و توسعه API ما روی همین مدل دامنه و نسخه پیش میروند.
احراز هویت را با سطح تهدید انتخاب کنید
برای پنل ادمین وب که روی همان دامنه است، session بههمراه CSRF معمولاً سادهتر و امنتر از JWT در localStorage است. برای اپ موبایل یا کلاینت شخص ثالث، token با عمر کوتاه و refresh مشخص معنی دارد. هر دو را در یک API قاطی نکنید مگر مرزشان روشن باشد.
هر endpoint عمومی را از نظر مجوز جدا فکر کنید. ساخت پیام تماس نباید به کاربر لاگین نیاز داشته باشد؛ خواندن لیست پیامها باید فقط برای staff باز باشد. اشتباه رایج این است که ViewSet پیشفرض همهٔ عملیات را باز میگذارد و بعد با عجله permission اضافه میشود.
امنیت لایهلایه، نه یک فایروال در انتها
- CORS را به دامنههای مشخص محدود کنید، نه
*در تولید - throttling روی فرم عمومی و لاگین بگذارید؛ بدون آن ربات ارزانترین حمله است
- secret را از محیط بخوانید، نه از ریپو
- پاسخ خطای اعتبارسنجی را یکدست کنید تا کلاینت حدس نزند
- درخواست مشکوک را لاگ کنید، اما متن رمز عبور را هرگز ننویسید
اگر پاسخ عمومی نباید شیء ساختهشده را برگرداند، to_representation را عوض کنید و یک پیام مشخص به زبان کاربر بدهید. برای مخاطب ایرانی پیام فارسی با کلیدهای success و message از JSON خام مدل قابلاعتمادتر است.
عملکرد: N+1 را قبل از کش حل کنید
select_related و prefetch_related را روی queryset همان ViewSet بگذارید، نه بعد از اینکه مانیتورینگ فریاد زد. برای لیستهای پرتکرار و کمتغییر، کش Redis با کلید نسخه و TTL کوتاه کافی است. کار سنگین مثل ارسال پیامک یا ساخت گزارش را از چرخهٔ درخواست جدا کنید.
اگر هنوز صف ندارید، حداقل شکست سرویس جانبی نباید فرم کاربر را رد کند. در تماسهای ورودی، اگر پیامک ادمین قطع شد، ذخیرهٔ رکورد باید موفق بماند و خطا فقط لاگ شود.
تستی که جلوی رگرسیون را میگیرد
قبل از هر ریلیز اینها را اجرا کنید:
- تست سریالایزر برای دادهٔ معتبر، ناقص و تکراری
- تست endpoint عمومی: ایجاد موفق و محدودیت نرخ
- تست endpoint محافظتشده: رد شدن کاربر عادی و پذیرش staff
- تست شکل پاسخ؛ اگر کلاینت
messageمیخواند، تغییر تصادفی فیلد یک باگ محصول است
پوشش صددرصد هدف نیست. مسیر پول، ورود و فرمهای عمومی باید همیشه سبز باشند. تنظیمات تست را از تولید جدا کنید: هش سریع، ایمیل حافظهای، و سرویس جانبی خاموش.
استقرار که شب خراب نمیشود
ایمیج چندمرحلهای، Gunicorn پشت Nginx، healthcheck و مهاجرت در CI حداقل تولید هستند. DJANGO_SETTINGS_MODULE را صریح بگذارید تا development بهاشتباه روی سرور بالا نیاید. کوکی امن، SECURE_PROXY_SSL_HEADER و هدایت HTTPS را در تنظیمات تولید متمرکز کنید.
جمعبندی
API تولیدی با Django یعنی دامنهٔ جدا، قرارداد پایدار، مجوز دقیق، و تست روی مسیرهای حیاتی. فریمورک اینها را رایگان نمیدهد؛ تیم باید آنها را انتخاب کند. اگر در حال ساخت یا بازسازی API محصول هستید، تماس بگیرید تا محدوده و ریسک را با هم مشخص کنیم.