سروش ذاکر شبیری
سروش ذاکر شبیری
خواندن ۳ دقیقه·۴ سال پیش

میکرونکات جنگو - بخش اول (settings.py)


Django Admin Micro Tips By Soroush Zaker Shoebiri
Django Admin Micro Tips By Soroush Zaker Shoebiri

خیلی وقت ها پیش میاد که ما حین انجام دادن پروژه های مختلف یا مطالعه کتاب ها به نکاتی بر میخوریم که به خودمون میگیم عههه چه جالب!! پس اینطوری بودش! یا مثلا اوه! مطمئنم این نکته یه روزی حتما به کارم میاد! اما دو روز بعد حتی یادمون نمیاد که همچین نکته ایی رو خونده باشیم.

حالا راه حل چیه؟

من اخیرا به عنوان یه برنامه نویس بک اند که از فریمورک جنگو استفاده میکنه شروع کردم به مطالعه یه سری کتاب در این زمینه (که احتمال خیلی زیاد بعدا توی یه پست راجع بهشون مینویسم) و با با کلی نکته مواجه شدم که رعایت کردنشون میتونه باعث تمیزتر شدن کدهام، کمتر شدن حجم کدها و شناخت بهتر از ابزاری که دارم باهاش کار میکنم به اسم جنگو بشه. شاید خیلی از این نکات رو هم از قبل میدونستم اما به مرور زمان و استفاده نکردن فراموششون کرده باشم.

پس تصمیم گرفتم در یک سری پست به اسم "میکرونکات جنگو" برای خودم بنویسمشون تا هرچند وقت برگردم و مرورشون کنم و البته امیدوارم برای شما هم مفید باشه.

نکات مربوط به settings پروژه:

  • ترتیب نوشتن appها در بخش installed_apps اهمیت داره. اگر همزمان دوتا app بخوان به یک resource دسترسی داشته باشن اونی که بالاتره اولویت بیشتری داره.
  • یکی از best parcticeهای جنگو اینه که appهامون رو داخل installed_apps براساس built-in#, #local و 3rd-party# بودن از هم جدا کنیم.
  • بااینکه این امکان وجود داره که وقتی یه app جدید ایجاد می کنیم فقط اسم این app رو داخل installed_apps بزاریم اما بهتره که به صورت کامل به کلاس کانفیگ اش اشاره کنیم مثلا:
blog.apps.BlogConfig
  • برای load کردن فایل های static در پروژه باید STATIC_URL ، STATIC_ROOT و STATICFILES_DIRS رو داخل تنظیمات مقداردهی کنیم.

تفاوت STATIC_URL ، STATIC_ROOT و STATICFILES_DIRS با همدیگه چیه؟

STATIC_ROOT:

ادرس path ایی که فایل های استاتیک داخل سرور production نگهداری میشن.

STATIC_URL:

اسم urlایی که از طریق اون میتونیم به فایل های استاتیک دسترسی داشته باشیم. مثلا

abcdefg.com/<static_url>/pic1.jpg

مشابه همین متغیرهارو ما برای فایل های media (فایل هایی که توسط کاربر اپلود میشن) داریم، یعنی MEDIA_URL و MEDIA_ROOT

برای استفاده از media ها در حالت development لازمه که فایل urls.py به صورت زیر ویرایش بشه:

from django.conf import settings from django.conf.urls.static import static urlpatterns = [ ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)


STATICFILES_DIRS:

وقتی که پروژه در فاز development هستش از این لیست برای نشون دادن path فایل های استاتیک استفاده میکنیم.

چرا STATICFILES_DIRS به صورت یک لیست تعریف شده؟
چون میتونیم فایل های استاتیک خودمون رو در جاها (یا بهتر بگم سرورها)ی مختلفی بزاریم و از آدرس های مختلفی اون هارو لود کنیم.

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

python manage.py collectstatics
  • علاوه برمقداردهی متغیرهای بالا نیازه که یه فولدر برای فایل های استاتیک ایجاد کنیم و اگر از template استفاده میکنیم حتما باید {% load static %} رو خط اول بنویسیم.
  • برای اینکه مشخص کنیم کاربر پس از لاگین به سیستم به کجا باید ریدایرکت بشه باید متغیر LOGIN_REDIRECT_URL رو داخل تنظیمات مقداردهی کنیم.
  • برای اینکه مشخص کنیم کاربر پس از logout از سیستم به کجا باید ریدایرکت بشه باید متغیر LOGOUT_REDIRECT_URL رو داخل تنظیمات مقداردهی کنیم.
  • وقتی میخوایم custom_user_model درست کنیم باید داخل setting متغیر AUTH_USER_MODEL رو ست کنیم.
  • اگر داخل modelها نیاز داریم که با user model کار کنیم بهتره به جای import کردن مستقیم این model از متد get_user_model استفاده کنیم.
  • جنگو برای پیدا کردن templateها به صورت دیفالت مسیر زیر رو نگاه میکنه:
app_directory > templates > same_app_name_directory > abc.html

پس وقتی لیست DIRS داخل templates در تنظیمات رو اپدیت میکنیم یعنی علاوه بر اون بیا این آدرسی که من میگم رو هم نگاه کن.

  • داخل settings یه متغیر داریم به اسم STATICFILES_FINDERS که به صورت implicit تعریف شده و اگر بخوایم اولویت اش رو تغییر بدیم میتونیم اون رو override کنیم.
STATICFILES_FINDERS = [ &quotdjango.contrib.staticfiles.finders.FileSystemFinder&quot, &quotdjango.contrib.staticfiles.finders.AppDirectoriesFinder&quot, ]

اولین مورد میاد داخل STATICFILES_DIRS رو میگرده

دومین مورد میاد داخل پوشه هر app رو میگرده

  • جنگو به ما این قابلیت رو میده که در یک پروژه چندین سایت رو مدیریت کنیم و برای این کار میتونیم در settings متغیر SITE_ID رو اضافه کنیم.
  • در حالت production:
DEBUG = False
SECURE_BROWSER_XSS_FILTER = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True


من سروش ذاکر شبیری هستم و ممنونم که این مطلب رو مطالعه کردید. در صورتی که سوال یا پیشنهادی داشتید خوشحال میشم که اون رو از طریق راه های زیر با من در میون بزارید. :)

در صورتی که این مطلب رو دوست داشتید، می تونید ادامه این مطلب رو در این لینک مطالعه کنید.


برنامه نویسیپایتونجنگوdjangopython
یه برنامه نویس که دوست داره همیشه مطالب جدیدی رو یادبگیره و اونهارو با دیگران به اشتراک بزاره.
شاید از این پست‌ها خوشتان بیاید