راهنمای برنامه نویسان برای آماده سازی اپلیکیشن های جنگو برای پروداکشن
دقیقاً در همین جا، میخواهیم نگاهی بیاندازیم به بهترین روشها، از نظر توسعه اپلیکیشن های بکند، یا SSR ها (اگر از تمپلیت جنگو استفاده بکنیم). در طول فرایند، به چراهای برخورداری از یک اپلیکیشن آماده تولید، به محض ایجاد پروژهمان میپردازیم. این رویکرد در تضاد با انتظار، جهت تکمیل کُل فرایند برنامه نویسی قرار میگیرد.
چرا حالا؟
در وهله اول، یک محصول مطلوب، هرگز و به صورت حقیقی به پایان نمیرسد. همیشه تغییری در واسط کاربری، یک باگ یا تخلف منطقی، یا بهتر از آن، استفاده از بازخورد کاربر برای اضافه کردن یک ویژگی جدید وجود دارد. اپلیکیشن ما باید از برخی جنبهها، جذابیت و حرکت رو به جلویی را بدست بیاورد. اینگونه به مساله بنگرید، آیا ما منتظر میمانیم تا تمامی بازخوردهای کاربر را دریافت بکنیم، قبل از اینکه اپلیکیشن را از جنبه تولید مورد بهینه سازی قرار بدهیم؟ نحوه رسیدگی به فایلهای رسانهای چگونه است؟ آیا در تمامی موارد، هنوز به صورت مستقیم به آنها رسیدگی میکنیم؟ آیا رمزهای عبور را به صورت سخت، روی پایگاه داده کدگذاری میکنیم؟ اگر ویژگی را اضافه بکنم، یا واسط کاربری را روی تنظیمات محلی تغییر بدهم، آنگاه شرایط چگونه خواهد بود؟ آیا این تغییرات، منجر به اختلال در روند تولید اپلیکیشن اصلی، از همان ابتدای کار میشوند؟
نکتهای که باید به آن اشاره کنیم به شرح زیر است : اپلیکیشن خود را راه اندازی بکنید، و تغییرات کوچک و تدریجی را در طول کار، به آن اعمال نمایید. هیچ tadaa وجود ندارد. اپلیکیشن فعال میشود و هرگز خراب، یا دچار تغییر نمیشود.پایان توضیح
اگر بسادگی در حال کدنویسی هستید، بگونه ای که کُل فرایند روی دستگاه شما اجرا میشود، و منتظر فرصت عالی هستید، باید این کار را متوقف کنید. این کار را متوقف کنید. به محض شروع پروژه، کنترل اپلیکیشن و پایپ لاین ها را در دست بگیرید. با برنامه "سلام دنیا"، آماده تولید باشید.
صحبت کردن کافی است. اجازه دهید چیزی که بتوانیم رویش کار بکنیم را ارائه بدهیم. ما یک محیط مجازی را میسازیم. ماژولهای وابسته را نصب میکنیم، و پروژه اساسی خودمان را مشخص مینماییم.
mkdir launch-ready
cd launch-ready
python -m venv .venv
source .venv/bin/activate
ما دایرکتوری launch-ready را میسازیم. اسم این شاخه، با اسم اپلیکیشن مدنظر یکسان است. ضمناً، محیط مجازی ساخته و فعال شده است. ادامه بدهید و جنگو را نصب بکنید، و هنگامی که داخل آن هستید، پروژه را ایجاد بکنید.
pip install django
django-admin startproject LaunchReady .
اکنون دایرکتوری ما چنین ظاهری خواهد داشت
(.venv) launch-ready ➤ ls
LaunchReady manage.py
(.venv) launch-ready ➤ ls LaunchReady
asgi.py __init__.py settings.py urls.py wsgi.py
(.venv) launch-ready ➤
اجرای python manage,py rusnerver، صفحه راه اندازی پیش فرض را برای جنگو حاصل میکند.
اپلیکیشن ما آماده، و در حال کار است. به منظور آماده شدن برای تولید، باید یک سری موارد را پیکربندی بکنیم.
ایجاد تنظیمات تولید و برنامه نویسی
یک فایل تنظیمات، در دایرکتوری launchready وجود دارد. در داخل این دایرکتوری، دایرکتوری دیگری به اسم settings را ایجاد میکنیم. فایل تنظیماتمان را به این دایرکتوری منتقل میکنیم. در حین انجام این فرایند، اسم فایل به base.py تغییر مییابد.
mkdir settings
mv -i settings.py settings/base.py
دو فایل اضافه در داخل دایرکتوری settings را ایجاد میکنیم ، و اسامی dev.py حاوی تنظیمات برنامه نویسی، و prod.py حاوی تنظیمات تولید را به آنها اختصاص میدهیم. در نهایت، دایرکتوری چنین ظاهری پیدا میکند.
(.venv) settings ➤ ls
base.py dev.py prod.py
در سطح محلی، روی ماشین برنامه نویسی، نصب محلی Mysql را انتخاب میکنیم. کار را ادامه بدهید، و پایگاه دادهای را ایجاد کنید، و سپس کاربر آماده گام بعدی میشود.
همانند بهترین روش کنترل نسخه، هرگز رمزعبور را در کد ذخیره نکنید. در تمامی موارد، متغیرهای محیطی را انتخاب کنید. برای مدیریت این کار، فایل.env را ایجاد میکنیم که هرگز از ماشین محلی عبور نمیکند. فقط مطمئن شوید، که آن را به فایل .gitignore اضافه میکنیم.
echo .env >> .gitignore
سپس کار را ادامه میدهیم و python-dotenv (برای خواندن متغیرها از فایل .evn)، و mysqlclient (رپری برای تعامل با mysql از جنگو) را نصب میکنیم.
pip install python-dotenv mysqlclient
تنظیمات برنامه نویسی، اینگونه خواهند بود.
Dev.py
from dotenv import load_dotenv
from LaunchReady.settings.base import *
load_dotenv()
# since it's running on my machine, show me the errors
DEBUG = True
SECRET_KEY = os.getenv("SECRET_KEY")
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": os.getenv("DATABASE_NAME"),
"USER": os.getenv("DATABASE_USER"),
"PASSWORD": os.getenv("DATABASE_PASSWORD"),
"HOST": os.getenv("DATABASE_HOST")
}
}
# show mail messages on the terminal
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
# run on every host.
ALLOWED_HOSTS = ["*"]
بدین ترتیب متغیرهای محیطی، از داخل تنظیمات برنامه نویسی خوانده میشوند، اما این مؤلفهها در چه مرحلهای تنظیم میشوند؟ ما فایل .env را در کنار تنظیمات dev ایجاد میکنیم.
(.venv) settings ➤ ls -a
base.py dev.py prod.py .env
محتوای فایل ؟
SECRET_KEY='django-generated-secret-key'
DATABASE_NAME=database_name
DATABASE_USER=database_user
DATABASE_PASSWORD=database_password
DATABASE_HOST=localhost
نکته:
میتوان از روشهای مختلفی برای تنظیم پایگاه داده، و کلید رمزی استفاده کرد. این پروسه، یک فرایند خطی محسوب نمیشود.
برای اپلیکیشن در دست تولید، مثالی از هروکو را در نظر میگیریم. طرز کار آن، مشابه سایر سرورهای قابل استفاده است، و یکی دو ترفند خاص برای آن لحاظ میشوند.
ما dj-database-url، که یک بسته پایتون است را نصب میکنیم. این ابزار به ما اجازه خواندن، و انجام عملیات روی پایگاه دادهای که روی پلتفرم متفاوتی قرار دارد، یا پلتفرمش با اپلیکیشن اصلی تفاوت دارد را میدهد.
pip install dj-database-url
لذا از آن در تنظیمات آماده تولید ، به صورت زیر استفاده میکنیم.
Prod.py
import dj_database_url
from LaunchReady.settings.base import *
ADMINS = (("Developer name", "Developer email"),)
# always set this to false in production
DEBUG = False
SECRET_KEY = os.environ["SECRET_KEY"]
ALLOWED_HOSTS = ["launch-ready-domain.com", "server-ip-address"]
DATABASES = {}
DATABASES["default"] = dj_database_url.config(conn_max_age=600, ssl_require=True)
# ToDo: get an email host provider
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_HOST_USER = os.environ["EMAIL_HOST_USER"]
EMAIL_HOST_PASSWORD = os.environ["EMAIL_PASSWORD"]
EMAIL_PORT = 587
EMAIL_USE_TLS = True
هنگامی که debug روی غلط (false) قرار میگیرد، دنبال این هستیم که بجای ظاهر شدن خطای "پیدا نشد"، اطلاع رسانی از طریق ایمیل را دریافت بکنیم. اگر یکی از نمایشها، استثنایی را برگشت بدهد، این وضعیت به طور خاص برقرار خواهد بود. در چنین حالتی، برنامه نویسان مسئول را فعال میکنیم.
ADMINS = (("Developer name", "Developer email"),)
هنگامی که سرور لینوکس آماده کار باشد، متغیرهای محیطی پیوستهای را تعریف میکنیم. در این حالت، از فایلهای تنظیمات bash اطلاعات را میخوانیم. آنها در یکی از دو حالت /etc/environment (برای تنظیم محیط در حد سیستم)، یا ~/.bashrc- (برای تنظیمات مخصوص هر کاربر)، در صورت وجود چندین کاربر قرار میگیرند.
/etc/enviromnet
SECRET_KEY=''
DATABASE_URL=''
# this is common with heroku and can be set via the console or dashboard interface
DJANGO_SETTINGS_MODULE=''
EMAIL_HOST_USER=''
EMAIL_PASSWORD=''
تنها تفاوت اساسی، نسبت به تنظیمات برنامه نویسی قبلی، به نحوه خواندن تنظیمات پایگاه داده برمی گردد.
DATABASES = {}
DATABASES["default"] = dj_database_url.config(conn_max_age=600, ssl_require=True)
در اینجا، نحوه خواندن اطلاعات از پایگاه داده خارجی، توسط اپلیکیشن را مشخص میکنیم. این دریافت داده از مکان اختصاص یافته به سرور اپلیکیشن مدنظر صورت میگیرد.
اجازه دهید این اجرا را آزمایش بکنیم. به شل خود بروید، و سرور برنامه نویسی خود را اجرا نمایید. بیاد داشته باشید، ما تنظیمات را به صورت نهفته، و تقسیم شده لحاظ نمودهایم. لذا برای اجرای هر برنامهای در مرحله برنامه نویسی، باید تنظیمات قابل استفاده ا به جنگو یادآوری بکنیم.
python manage.py runserver --settings=LaunchReady.settings.dev
تمپلیت پیش فرض اپلیکیشن، مجدداً فعال میشود.
برای تولید، آن را اینگونه اجرا میکنیم.
python manage.py runserver 0.0.0.0:8000 --settings=LaunchReady.settings.prod
مرورگر خود را باز کنید، و به آدرس http://launch-ready-domain.com:8000 بروید. شما همان صفحهای که در محیط برنامه نویسی وجود دارد را مشاهده میکنید.
آینده چگونه خواهد بود؟
قطعاً، مطالب بیشتری راجع به تنظیمات، و پیکربندی سرور اجرا، علی الخصوص در رابطه با بهره برداری از فایلهای استاتیک، وجود خواهند داشت. البته این موارد، به جلسه بعدی موکول میشوند. در هنگام دسترسی به منابع لازم، از این مطلب پایهای استفاده میکنیم، و این کار را در گام بعدی انجام میدهیم. این کد از مخزن کدهای سبز، بخوبی قابل دسترسی است.