django

پلتفرم Django

(Django Platform)

🎯 توضیحات و نکات تکمیلی

فهرست عناوین:

انتخاب نسخه‌ی Python

به‌صورت پیش‌فرض برنامه‌ی شما روی Python 3.8 اجرا می‌شود. در صورتی که قصد دارید نسخه دیگری را برای اجرای برنامه‌ی‌تان استفاده کنید می‌توانید داخل فایل liara.json بخش زیر را اضافه کنید. توجه داشته باشید که فایل liara.json را باید در کنار فایل requirements.txt بسازید:

{
  "django": {
    "pythonVersion": "3.12"
  }
}

  • 3.7
  • 3.8
  • 3.9
  • 3.10 (پیش‌فرض)
  • 3.11
  • 3.12

استفاده از Supervisord

در صورتی که نیاز به Worker برای اجرای Background Job‌ها برای مثال با Celery را دارید، می‌توانید یک فایل به‌نامsupervisor.confدر کنار requirements.txtبسازید و سپس دیپلوی کنید. در این‌صورت Supervisor اجرا شده و دستور شما را در Background اجرا خواهد کرد. در ادامه، یک نمونه فایل supervisor.confرا مشاهده می‌کنید:

[program:celery-worker]
process_name=%(program_name)s_%(process_num)02d
command=celery -A proj worker -l INFO
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=1
startsecs=10
stopwaitsecs=600
redirect_stderr=true
stdout_logfile=/tmp/worker.log
برای کسب اطلاعات بیشتر در رابطه با نحوه‌ی شروع به کار Celery در برنامه‌‌های Django می‌توانید دستورالعمل Celery در برنامه‌های Django را مطالعه کنید.

دستور collectstatic

در هر استقراری که انجام می‌دهید، لیارا به‌صورت خودکار دستورpython manage.py collectstaticرا اجرا می‌کند. برای جلوگیری از اجرای خودکار این دستور، باید تنظیمات زیر را در فایل liara.json قرار بدهید:

{
  "django": {
    "collectStatic": false
  }
}

دستور compilemessages

اگر برنامه‌ی شما چند زبانه است و نیازمند اجرای دستورpython manage.py compilemessagesبعد از هر بار استقرار هستید، باید تنظیمات زیر را در فایل liara.json قرار بدهید:

{
  "django": {
    "compileMessages": true
  }
}
در صورتی که این پارامتر را فعال کنید، حتما لازم است که پوشه‌یlocaleدر ریشه‌ی برنامه‌ی‌تان قرار داشته باشد.

جلوگیری از اعمال تغییرات در فایل settings.py

لیارا به‌صورت خودکار فایلsettings.pyبرنامه‌ی شما را پیدا کرده و در انتهای آن تنظیماتی را اضافه می‌کند تا برای اجرا آماده شود. چنانچه قصد غیر فعال کردن آن را دارید، باید فایل liara.json زیر را به‌ریشه‌ی برنامه‌ی‌تان اضافه کنید:

{
  "django": {
    "modifySettings": false
  }
}
توجه داشته باشید که فقط و فقط این قابلیت را زمانی غیرفعال کنید که کاملا به‌نتایج آن آگاه باشید.

تنظیمات Nginx

در برنامه‌های Django لیارا از وب‌سرور Nginx استفاده می‌شود و پیکربندی پیش‌فرض این وب‌سرور به‌شکل زیر است:

client_max_body_size 100M;

location /media {
  alias /usr/src/app/media;
}

location /static {
  alias /usr/src/app/staticfiles;
}

location / {
  try_files /dev/null @django_app;
}

location ~\.sqlite3$ {
  deny all;
  error_page 403 =404 /;
}

location ~ /\.well-known {
  allow all;
}

حال شما می‌توانید یک فایل با نام liara_nginx.confدر مسیر اصلی پروژه‌ی خود ایجاد کرده و پیکربندی وب‌سرور Nginx را متناسب با نیاز خود تغییر دهید. برای مثال، برای فعال‌کردن فشرده‌سازیgzipمی‌توانید به‌شکل زیر عمل کنید:

gzip             on;
gzip_disable     "msie6";
gzip_vary        on;
gzip_proxied     any;
gzip_comp_level  6;
gzip_types       text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;

client_max_body_size 100M;

location /media {
  alias /usr/src/app/media;
}

location /static {
  alias /usr/src/app/staticfiles;
}

location / {
  try_files /dev/null @django_app;
}

location ~\.sqlite3$ {
  deny all;
  error_page 403 =404 /;
}

location ~ /\.well-known {
  allow all;
}
این نکته را در نظر داشته باشید که امکان تغییر تنظیمات nginx از ابتدا وجود ندارد. شما می‌توانید تنها برخی از این تنظیمات را شخصی‌سازی کنید. در نهایت، فایل تنظیمات شما داخل بلاک server در تنظیمات اصلی، include خواهد شد.

تنظیم هدرهای امنیتی HTTP

برای جلوگیری از حملاتی مانند Clickjacking، XSS، SSL Striping می‌توانید هدرهای امنیتی را مانند مثال زیر در تنظیمات Nginx برنامه‌ی خود تنظیم کرده و نحوه‌ی برقراری ارتباط با سایت را برای مرورگرها تعیین کنید:

add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options: nosniff;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

client_max_body_size 100M;

location /media {
  alias /usr/src/app/media;
}

location /static {
  alias /usr/src/app/staticfiles;
}

location / {
  try_files /dev/null @django_app;
}

location ~\.sqlite3$ {
  deny all;
  error_page 403 =404 /;
}

location ~ /\.well-known {
  allow all;
}
توجه داشته باشید که قبل از فعال‌سازی HSTS با تنظیم هدر Strict-Transport-Security باید SSL را فعال کرده باشید. تهیه‌ی SSL رایگان

افزایش محدودیت حجم آپلود فایل

همان‌طور که در بخش قبلی گفته شد، پلتفرم Django در لیارا با استفاده از وب‌سرور Nginx مستقر و اجرا می‌گردد. در این وب‌سرور، به‌صورت پیش‌فرض حداکثر حجم مجاز آپلود فایل 1MB در نظر گرفته شده‌است. شما می‌توانید یک فایل با نامliara_nginx.confدر کنارrequirements.txtبسازید و محتویات زیر را داخل آن قرار دهید و سپس دستورliara deployرا وارد کنید:

client_max_body_size 250M;

location /media {
  alias /usr/src/app/media;
}

location /static {
  alias /usr/src/app/staticfiles;
}

location / {
  try_files /dev/null @django_app;
}

location ~\.sqlite3$ {
  deny all;
  error_page 403 =404 /;
}

location ~ /\.well-known {
  allow all;
}

با قرار دادن فایل بالا در ریشه‌ی برنامه‌ی‌تان حداکثر حجم مجاز آپلود فایل به 250MB افزایش می‌یابد. شما می‌توانید مقدار دلخواه خودتان را تنظیم کنید.

تنظیم منطقه‌ی زمانی (TimeZone)

به صورت پیش‌فرض، منطقه‌ی زمانی بر روی Asia/Tehran تنظیم شده است. برای تغییر مقدار پیش‌فرض، می‌توانید از پارامترtimezoneدر فایل liara.json استفاده کنید. برای نمونه:

{
  "platform": "django",
  "app": "django-starter",
  "django": {
    "timezone": "America/Los_Angeles"
  }
}

رفع خطای CORS فایل‌های Media

مسئولیت ارائه فایل‌های رسانه (Media) به کاربران در پلتفرم Django برعهده‌ی وب‌سرور (Nginx) است، حال اگر کاربران شما برای دسترسی به فایل‌های رسانه با خطای CORS مواجه شدند باید تنظیمات Nginx پروژه‌ی خود را شخصی‌سازی کنید. برای رفع این خطا، یک فایل با نام liara_nginx.conf در مسیر اصلی پروژه‌ی خود ایجاد کرده و قطعه‌کد زیر را در این فایل قرار دهید:

client_max_body_size 100M;

location /media {
  add_header Access-Control-Allow-Origin *;
  alias /usr/src/app/media;
}

location /static {
  alias /usr/src/app/staticfiles;
}

location / {
  try_files /dev/null @django_app;
}

location ~\.sqlite3$ {
  deny all;
  error_page 403 =404 /;
}

location ~ /\.well-known {
  allow all;
}

سپس برای اعمال این تغییرات، دستور liara deploy را در مسیر اصلی پروژه‌ی خود اجرا کنید.

با اعمال این پیکربندی، فایل‌های قرار گرفته در پوشه‌ی mediaبا HeaderAccess-Control-Allow-Originو مقدار*Serve می‌شوند. همچنین شما می‌توانید مقدار دلخواه خودتان را تنظیم کنید.

افزایش زمان تایم‌اوت Gunicorn

درصورتی که در برنامه‌ی Django خود با خطای [CRITICAL] WORKER TIMEOUT مواجه شده‌اید و به WORKER TIMEOUT بیشتر از ۳۰ ثانیه نیاز دارید می‌توانید وارد تنظیمات برنامه‌ی Django خود شده و در بخش متغیرها، متغیر GUNICORN_TIMEOUT=60 را به‌شکل زیر اضافه کرده و درنهایت با کلیک بر روی دکمه ثبت تغییرات، WORKER TIMEOUT برنامه را افزایش دهید.

توجه داشته باشید که متغیر GUNICORN_TIEMOUT براساس ثانیه است.

تنظیم مقدار Gunicorn max_request

یکی از راه‌های جلوگیری از Memory leak و مصرف بالای RAM در Gunicorn، تنظیم پارامتر max_requests است. با تنظیم این پارامتر، با رسیدن تعداد درخواست‌های هر یک از Threadهای Gunicorn به این عدد، آن Thread ری‌استارت شده و حافظه‌ی RAM آن خالی می‌شود. در صورتی که در برنا‌مه‌ی Django خود نیاز به ری‌استارت WORKER THREAD بعد از تعداد مشخصی Request دارید، می‌تونید وارد تنظیمات برنامه‌ی Django شده و در بخش متغیر‌ها، متغیر GUNICORN_MAX_REQUESTS=1000 را اضافه کرده و در نهایت روی دکمه ثبت تغییرات کلیک کنید. همچنین توجه داشته باشید که مقدار پیش‌فرض برابر با GUNICORN_MAX_REQUESTS=10000 است.

تنظیم مقدار Gunicorn workers

برای تنظیم تعداد worker‌های gunicorn می‌توانید از متغیر محیطی GUNICORN_WORKERS استفاده کنید. مقدار پیش‌فرض این متغیر برابر با ۳ است.

رفع خطای CORS

درصورتی که Headerهای مربوط به CORS را با استفاده از پکیج django-cors-headers، در Middleware برنامه‌ی خود تنظیم کرده‌اید بایدCORS_ALLOWED_ORIGINS و CORS_ALLOW_METHODS را نیز در فایل settings.py تعریف کرده باشید:

CORS_ALLOWED_ORIGINS = [
    "https://example.com",
    "https://www.example.com",
]

CORS_ALLOW_METHODS = [
  "DELETE",
  "GET",
  "OPTIONS",
  "PATCH",
  "POST",
  "PUT",
]

استقرار برنامه‌های ASGI

برای استقرار برنامه‌های ASGI در پلتفرم Django لیارا تنها باید WSGI_APPLICATION را از فایل settings.py برنامه حذف کنید و مسیر فایل پیکربندی برنامه‌ی ASGI خود را در متغیر ASGI_APPLICATION مقداردهی کنید.

غیرفعال کردن Mirror

Mirror اختصاصی لیارا به‌منظور دانلود سریع‌تر پکیج‌ها در پلتفرم Django به‌صورت پیش‌فرض فعال است اما شما می‌توانید با قرار دادن قطعه‌کد زیر در فایل liara.json، این قابلیت را غیر فعال کنید:

{
  "django": {
    "mirror": false
  }
}

استفاده از GDAL

برای استفاده از GDAL در پلتفرم Django یک فایل به نام liara.json ایجاد کرده و محتویات زیر را به آن اضافه کنید:

{
    "django": {
        "geospatial": true
    }
}
توجه داشته باشید که نسخه پکیج GDAL با نسخه Python باید سازگار باشند. در پلتفرم Django نسخه پیش‌فرض Python برابر با 3.9 و نسخه متناسب پکیج GDAL برابر با 3.6.0 است. در صورتی که نسخه Python را تغییر دهید، پکیج GDAL را نیز باید متناسب با نسخه Python انتخاب کنید.
;