5 کاری که باید در زمان دیپلوی جنگو انجام دهید
بعد از اینکه توسعه برنامه جنگویی خودتان را به پایان رساندید و خواستید آن را دیپلوی کنید، نکاتی وجود دارد که رعایت کردن آنها باعث افزایش کارایی و نگهداری آسان برنامه میشود. در این مقاله 5 مورد از مهمترین کارهایی که باید در زمان دیپلوی پروژه انجام دهید را برای شما آورده ایم.
دوره پیشنهادی: دوره آموزش رایگان جنگو
# ذخیره اطلاعات حساس در متغیرهای محیطی
در پروژه های جنگو اطلاعات حساس مانند secret_key یا اعتبارسنجی دیتابیس و یا کلیدهای Api در فایل settings.py قرار میگیرند. اما در زمان استقرار پروژه جنگو در یک سرور واقعی، این کلیدهای حساس نباید در فایل settings.py باقی بمانند، بلکه باید با متغیرهای محیطی در زمان اجرا بارگذاری شوند.
متغیر محیطی، متغیری است که مقدار آن در خارج از برنامه، معمولاً در سیستم عامل تنظیم می شود. یک متغیر محیطی از یک جفت key/value تشکیل شده است. همچنین متغیرهای محیطی به ما کمک میکنند اطلاعات حساس (مثلاً رمزهای عبور، توکنهای API و غیره) را خارج از git نگه داریم.
بنابراین به جای نوشتن این موارد در فایل تنظیمات، از کتابخانه OS برای خواندن متغیرهای محیطی برای کد خود استفاده می کنید:
import os
DEBUG = os.environ.get('DEBUG', False)
SECRET_KEY = os.environ.get('SECRET_KEY')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('RDS_DB_NAME'),
'USER': os.environ.get('RDS_USERNAME'),
'PASSWORD': os.environ.get('RDS_PASSWORD'),
'HOST': os.environ.get('RDS_HOST'),
'PORT': os.environ.get('RDS_PORT'),
}
}
# ذخیره مدیا فایل ها و استاتیک فایل ها در فضای ابری
بهطور پیشفرض، فایلهای media و فایلهای static جنگو در سیستم لوکال ذخیره میشوند. این ممکن است زمانی که در حال توسعه هستید عالی عمل کند، اما به محض اینکه وارد مرحله استقرار برنامه شوید، به زودی با مشکل مواجه خواهید شد.
تصور کنید که یک سرور ایجاد کرده و برنامه خود را مستقر کرده اید که به کاربران اجازه می دهد تصاویر خود را به عنوان فایل های media آپلود کنند. بعد از مدتی با ده ها هزار تصویر مواجه خواهید شد که در کنار سورس کد شما قرار گرفته اند. مدیریت این تصاویر به شدت مشکل خواهد بود مخصوصا اگر بخواهید سرورتان را عوض کنید.
راه حل همه اینها اینست که همه فایل های خود را در یک فضای ابری که از سرور شما جدا شده است، ذخیره کنید. این یکی از مواردی است که به نظر من برای هر وب سایتی ضروری است، اگر این کار را انجام ندهید در آینده باعث سردردهای زیادی خواهد شد.
در ایران میتوانید از سرویس فضای ابری آروان کلود استفاده کنید که نحوه اتصال به آن در دوره پیشرفته جنگو آموزش داده شده است.
# خاموش کردن حالت دیباگ
در فایل settings.py جنگو، مقدار DEBUG را خواهید دید که یک مقدار بولین است که روی True یا False تنظیم می شود. این مقدار باید همیشه به دلایل متعدد در زمان استقرار روی False تنظیم شود.
مهم ترین کاری که DEBUG انجام می دهد خاموش کردن حالت اشکال زدایی است. به این معنی که وقتی خطایی در وبسایت شما رخ میدهد، پیغام خطای با جزئیات بالا(traceback) نمایش داده نشده و فقط یک صفحه خطا ساده نشان داده میشود یا فقط کد وضعیت HTTP خطا را نمایش میدهد. این بسیار مهم است زیرا به شما کمک می کند اطلاعات محرمانه را پنهان کنید. Traceback میتواند حاوی اطلاعات حساس باشد یا نمایشی از کد شما بدهد که میخواهید از چشم عموم دور نگه دارید.
آخرین نکته ای که باید به آن توجه کنید این است که وقتی از حالت DEBUG=True در طول توسعه استفاده می کنید، جنگو تمام کوئری های SQL را که اجرا کرده اید در حافظه ram ذخیره می کند تا اشکال زدایی را آسان تر کند. این عامل باعث میشود که در زمان استقرار پروژه حافظه ram شما به سرعت مصرف شده و با کمبود منابع مواجه خواهید شد.
مقاله پیشنهادی: اجرای جنگو با پستگرس، nginx و gunicorn
# استقرار جنگو با nginx و gunicorn
در زمان توسعه، با استفاده از دستور runserver سرور جنگو را اجرا میکردید. این یک ابزار کوچک عالی است اما برای ارائه وب سایت شما در مقیاس واقعی کافی نیست.
یک ترکیب عالی برای استقرار برنامه های جنگویی nginx و gunicorn است. راه اندازی این دو بسیار ساده است. از Nginx به عنوان یک «پراکسی معکوس» برای عبور از ترافیک به Gunicorn استفاده میکنید، که سپس از طریق رابط WSGI ارائهشده توسط جنگو در فایل wsgi.py به وبسایت ارائه میشود.
ویدیو پیشنهادی: آموزش ماژول logging در پایتون
# فعال کردن لاگ گیری
آیا تا به حال شده کاربرهایتان به شما اطلاع دهند که برنامه شما با خطا مواجه شده است. قطعا به عنوان یک برنامه نویس می خواهید اطلاعات بیشتری در رابطه با خطا داشته باشید تا بتوانید آن را حل کنید، شاید نیاز به یک پیام خطای دقیق داشته باشید تا بتوانید دلیل آن را متوجه شوید. در برخی موارد حتی ممکن است مطمئن نباشید که آیا اصلاً خطایی وجود دارد یا اینکه این فقط کاربر است که کار اشتباهی انجام داده.
پاسخ ساده اما کارآمد برای این مشکل، لاگ گیری(logging) است! متأسفانه اغلب این ویژگی هر زبان برنامه نویسی نادیده گرفته می شود و به عنوان چیزی که اولویت خاصی ندارد کنار گذاشته می شود.
در جنگو به راحتی میتوانید سیستم لاگ گیری خود را در فایل settings.py راه اندازی کنید. یک روش پیشنهادی این است که همه پیامها را در یک فایل ثبت کنید و سپس در صورت بروز هرگونه خطای جدی در وبسایت، از طریق ایمیل به مدیران وبسایت هشدار دهید. شما می توانید با تنظیمات زیر به این نوع پیکربندی برسید:
ADMINS = [('John', 'john@example.com'), ('Mary', 'mary@example.com')]
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': '/path/to/django/debug.log',
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
}
},
'loggers': {
'django': {
'handlers': ['file', 'mail_admins'],
'propagate': True,
},
}
}
با این نوع پیکربندی، هنگامی که یک پیغام گزارش سطح ERROR رخ داد، بلافاصله به شما هشدار داده می شود، و برای هر مشکل دیگری به شما این امکان را می دهد که به سادگی به فایل گزارش برگردید و بیشتر بررسی کنید.