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

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 = FalseSECURE_BROWSER_XSS_FILTER = TrueSESSION_COOKIE_SECURE = TrueCSRF_COOKIE_SECURE = Trueمن سروش ذاکر شبیری هستم و ممنونم که این مطلب رو مطالعه کردید. در صورتی که سوال یا پیشنهادی داشتید خوشحال میشم که اون رو از طریق راه های زیر با من در میون بزارید. :)در صورتی که این مطلب رو دوست داشتید، می تونید ادامه این مطلب رو در این لینک مطالعه کنید.