آموزش ماژولار کردن فایل settings در فریمورک Django

اگه با فریمورک محبوب و دوست داشتنی django ( جنگو ) کار کرده باشید حتما با فایل settings.py در روت اصلی پروژه آشنا هستید و کاربرد اون را میدونید.جنگو از معروفترین فریورک های وب زبان پایتونوقتی با دستور : $ django-admin startproject proj-name یک پروژه جنگویی جدید میسازیم فایل settings.py به صورت زیر است : ( بسته به ورژن جنگو ممکن است کمی با متن زیر متفاوت باشد )&quot&quot&quot Django settings for proj-name project. Generated by 'django-admin startproject' using Django 3.2.4. For more information on this file, see https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ &quot&quot&quot from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-tsjcndnvd;kbmd;mdajj!z9i*&$&&f1k5h!f_gn7#bb2(ud' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'proj-name.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'proj-name.wsgi.application' # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } # Password validation # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'Asia/Tehran' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ STATIC_URL = '/static/' # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'مسلما در حین پروژه تنظیمات زیادی به به این فایل اضافه میشه که بعضی از اون ها ثابت و بعضی بسته به محیط development یا production متفاوت اند .( مانند متغیر های DEBUG و ALLOWED_HOSTS )در روت اصلی پروژه ( کنار فایل settings.py ) یه دایرکتوری به نام settings میسازیم و چهار فایل زیر را هم داخلش میسازیم :__init__.py base.py production.py development.pyالان روت اصلی پروژه ما به این صورت هست : ├── proj-name/ │ ├── __init__.py │ ├── settings/ │ │ ├── base.py │ │ ├── development.py │ │ ├── __init__.py │ │ └── production.py │ ├── urls.py │ └── wsgi.py └── manage.pyحالا فایل base.py را ویرایش میکنیم و اون تنظیماتی از پروژه را که در هر دو حالت development و production ثابت هستند را داخلش مینویسیم :from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-tsjcndnvd;kbmd;mdajj!z9i*&$&&f1k5h!f_gn7#bb2(ud' # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'proj-name.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'proj-name.wsgi.application' # Password validation # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'Asia/Tehran' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = [ BASE_DIR / &quotstatic&quot ] # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'تنظیماتی که بالا میبینید همگی تنظیماتی هستند که در طول کل پروژه ثابت هستند و برای محیط های مختلف نیازی به تغیر ندارند.فایل development.py ویژه تنظیماتی از پروژه است که فقط برای محیط develop هستند :from .base import * DEBUG = True ALLOWED_HOSTS = [] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }همچنین در فایل production.py تنظیماتی را قرار میدیم که برای محیط production یا همون دپلوی پروژه هستند :from .base import * DEBUG = False ALLOWED_HOSTS = [ 'www.test.com', 'test.com', ] STATIC_ROOT = 'static_root' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'your_database_name', 'USER': 'your_database_user', 'PASSWORD': 'your_password', 'HOST': 'your_host', 'PORT': 'your_port', } } اگه دقت کرده باشد در دو فایل بالا اول هر خط فایل base.py را ایمپورت کرده ایم این کار برای دسترسی به بقیه تنظیمات پروژه است چون باید به جنگو بگیم که فایل settings.py تغیر کرده و آدرس یکی از دو فایل development.py و production.py بهش بدیم.برای اینکه به جنگو بفهمونیم که فایل settings.py ما تغیر کرده دو روش وجود داره :روش اولاز طریق ترمینال هنگام ران کردن پروژه :$ python manage.py migrate --settings=proj-name.settings.productionروش دوماز طریق فایل manage.py پروژه :#!/usr/bin/env python &quot&quot&quotDjango's command-line utility for administrative tasks.&quot&quot&quot import os import sys def main(): &quot&quot&quotRun administrative tasks.&quot&quot&quot os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj-name.settings.development') # <-- Change here! try: from django.core.management import execute_from_command_line except ImportError as exc: raise ImportError( &quotCouldn't import Django. Are you sure it's installed and &quot &quotavailable on your PYTHONPATH environment variable? Did you &quot &quotforget to activate a virtual environment?&quot ) from exc execute_from_command_line(sys.argv) if __name__ == '__main__': main()