টিএল; ডিআর: কৌশলটি হ'ল আপনি যে কোনও os.environment
আমদানির আগে সংশোধন করতে পারেন , এটি জিনিসগুলিকে ব্যাপকভাবে সরল করবে।settings/base.py
settings/<purpose>.py
এই সমস্ত আন্তঃসরিত ফাইলগুলি সম্পর্কে কেবল চিন্তা করা আমার মাথাব্যথা দেয়। মিশ্রণ, আমদানি (কখনও কখনও শর্তযুক্ত), ওভাররাইডিং, ক্ষেত্রে DEBUG
সেটিংসে ইতিমধ্যে সেট করা প্যাচিং পরে পরিবর্তিত হয়। কি একটা দুঃস্বপ্ন!
বছরের পর বছর ধরে আমি সমস্ত বিভিন্ন সমাধান দিয়েছি। এগুলি সব কিছুটা কাজ করে তবে পরিচালনা করতে এত কষ্ট হয়। ডব্লিউটিএফ! আমাদের কি সত্যিই সেই ঝামেলা দরকার? আমরা মাত্র একটি settings.py
ফাইল দিয়ে শুরু করেছি । এইগুলি সঠিকভাবে সঠিকভাবে একত্রিত করার জন্য এখন আমাদের একটি ডকুমেন্টেশন প্রয়োজন!
আমি আশা করি আমি অবশেষে নীচের সমাধানের সাথে (আমার) মিষ্টি স্পটে আঘাত করব।
আসুন লক্ষ্যগুলি পুনরায় কাটা (কিছু সাধারণ, কিছু আমার)
গোপনীয় বিষয়গুলিকে গোপন রাখুন - এগুলি কোনও রেপোতে সংরক্ষণ করবেন না!
পরিবেশের সেটিংস, 12 ফ্যাক্টর স্টাইলের মাধ্যমে কী এবং গোপনীয় সেট / পড়ুন ।
বুদ্ধিমান ফ্যালব্যাক ডিফল্ট রয়েছে। স্থানীয়ভাবে উন্নয়নের জন্য আপনাকে ডিফল্টগুলির চেয়ে বেশি কিছু লাগবে না।
… তবে ডিফল্ট উত্পাদন নিরাপদ রাখার চেষ্টা করুন। উত্পাদনের জন্য নিরাপদে ডিফল্ট সেটিংস সামঞ্জস্য করার চেয়ে মনে রাখার চেয়ে স্থানীয়ভাবে একটি সেটিং ওভাররাইড মিস করা ভাল।
DEBUG
অন্য সেটিংসে (যেমন জাভাস্ক্রিপ্ট সংক্ষেপিত ব্যবহার করে বা না ব্যবহার করে) এর প্রভাব ফেলতে পারে এমনভাবে সুইচ অফ / অফ করার ক্ষমতা রাখুন ।
স্থানীয় / টেস্টিং / স্টেজিং / প্রোডাকশনের মতো উদ্দেশ্য সেটিংসের মধ্যে স্যুইচিংয়ের ভিত্তিতে DJANGO_SETTINGS_MODULE
আরও কিছু করা উচিত ।
… তবে পরিবেশের সেটিংসের মতো আরও প্যারামিটারাইজেশনকে অনুমতি দিন DATABASE_URL
।
… এছাড়াও তাদের বিভিন্ন উদ্দেশ্য সেটিংস ব্যবহার করতে এবং পাশাপাশি স্থানীয়ভাবে এগুলি চালানোর অনুমতি দিন। স্থানীয় ডেভেলপার মেশিনে উত্পাদন সেটআপ, উত্পাদন ডেটাবেস বা ধোঁয়া পরীক্ষার সংকোচিত স্টাইল শীট অ্যাক্সেস করতে।
যদি কোনও পরিবেশের পরিবর্তনশীল স্পষ্টভাবে সেট না করা হয় (বিশেষত উত্পাদনে যেমন, খালি মূল্য প্রয়োজন)। EMAIL_HOST_PASSWORD
।
DJANGO_SETTINGS_MODULE
জ্যাঙ্গো -অ্যাডমিন স্টার্টপ্রজেক্ট চলাকালীন ম্যানেজ.পিতে ডিফল্ট সেটটিতে প্রতিক্রিয়া জানান
, ন্যূনতম কন্ডিশন রাখুন যদি অবস্থা উদ্দেশ্য পরিবেশ, যুক্ত উদ্দেশ্য সেটিংস ফাইলে ওভাররাইড সেটিংস (উৎপাদন সেট লগ ফাইল এবং এটি আবর্তনের জন্য যেমন।) প্রকার।
না
ডিজেঙ্গোকে ডিজেঙ্গো_এসটিটিঙ্গস_মুডুল সেটিংটি কোনও ফাইল তৈরি করতে দেবেন না।
ইসস! এটি কেমন মেটা তা ভেবে দেখুন। আপনার যদি কোনও ফাইল (ডকার এনভের মতো) থাকতে হয় তবে একটি জাঙ্গো প্রক্রিয়া শুরু করার আগে এটি পরিবেশে পড়ুন।
আপনার প্রকল্প / অ্যাপ্লিকেশন কোডে DJANGO_SETTINGS_MODULE ওভাররাইড করবেন না, যেমন। হোস্টনাম বা প্রক্রিয়া নামের উপর ভিত্তি করে।
আপনি যদি পরিবেশের পরিবর্তনশীল সেট করতে অলস হন (যেমন setup.py test
) আপনার প্রকল্প কোডটি চালানোর ঠিক আগে সরঞ্জামটি করে এটি করুন।
জ্যাঙ্গো কীভাবে সেটিংস পড়ছে তা যাদু এবং প্যাচিং এড়ান, সেটিংসটিকে প্রাক প্রসেস করুন তবে পরে হস্তক্ষেপ করবেন না।
জটিল যুক্তি ভিত্তিক বাজে কথা নয়। কনফিগারেশন স্থির করা উচিত এবং ফ্লাইতে গণনা করা উচিত নয় material ফ্যালব্যাক ডিফল্ট সরবরাহ করা এখানে যথেষ্ট যুক্তিযুক্ত।
আপনি কি সত্যিই ডিবাগ করতে চান, কেন স্থানীয়ভাবে আপনার সেটিংসের সঠিক সেট রয়েছে তবে একটি রিমোট সার্ভারে, শতাধিক মেশিনের একটিতে, আলাদাভাবে কিছু গণনা করা হচ্ছে কেন? উহু! ইউনিট পরীক্ষা? সেটিংসের জন্য? সিরিয়াসলি?
সমাধান
আমার কৌশল চমৎকার নিয়ে গঠিত জ্যাঙ্গো-পরিবেশ নিয়ে ব্যবহৃত ini
শৈলী ফাইল, প্রদান os.environment
স্থানীয় উন্নয়নের জন্য ডিফল্ট, কিছু ন্যূনতম ও স্বল্প settings/<purpose>.py
আছে একটি ফাইল
import settings/base.py
পরেos.environment
একটি থেকে সেট করা হয় INI
ফাইল। এটি কার্যকরভাবে আমাদের এক ধরণের সেটিংস ইঞ্জেকশন দেয়।
কৌশলটি এখানে os.environment
আমদানি করার আগে সংশোধন করা settings/base.py
।
সম্পূর্ণ উদাহরণটি দেখতে রেপোতে যান: https://github.com/wooyek/django-settings-strategy
.
│ manage.py
├───data
└───website
├───settings
│ │ __init__.py <-- imports local for compatibility
│ │ base.py <-- almost all the settings, reads from proces environment
│ │ local.py <-- a few modifications for local development
│ │ production.py <-- ideally is empty and everything is in base
│ │ testing.py <-- mimics production with a reasonable exeptions
│ │ .env <-- for local use, not kept in repo
│ __init__.py
│ urls.py
│ wsgi.py
সেটিংস / .env
স্থানীয় উন্নয়নের জন্য খেলাপি। একটি গোপন ফাইল, বেশিরভাগ প্রয়োজনীয় পরিবেশের ভেরিয়েবল সেট করতে। স্থানীয় বিকাশে প্রয়োজনীয় না হলে খালি মানগুলিতে সেগুলি সেট করুন। আমরা এখানে ডিফল্ট সরবরাহ করি এবং নাsettings/base.py
পরিবেশ থেকে অনুপস্থিত থাকলে অন্য কোনও মেশিনে ব্যর্থ হওয়ার জন্য ।
সেটিংস / local.py
এখানে যা ঘটে তা হ'ল পরিবেশটি লোড করা settings/.env
, এর থেকে সাধারণ সেটিংস আমদানি করা settings/base.py
। এর পরে আমরা স্থানীয় উন্নয়নকে স্বাচ্ছন্দ্য করতে কয়েকটিকে ওভাররাইড করতে পারি।
import logging
import environ
logging.debug("Settings loading: %s" % __file__)
# This will read missing environment variables from a file
# We wan to do this before loading a base settings as they may depend on environment
environ.Env.read_env(DEBUG='True')
from .base import *
ALLOWED_HOSTS += [
'127.0.0.1',
'localhost',
'.example.com',
'vagrant',
]
# https://docs.djangoproject.com/en/1.6/topics/email/#console-backend
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
LOGGING['handlers']['mail_admins']['email_backend'] = 'django.core.mail.backends.dummy.EmailBackend'
# Sync task testing
# http://docs.celeryproject.org/en/2.5/configuration.html?highlight=celery_always_eager#celery-always-eager
CELERY_ALWAYS_EAGER = True
CELERY_EAGER_PROPAGATES_EXCEPTIONS = True
সেটিংস / production.py
উত্পাদনের জন্য আমাদের এনভায়রনমেন্ট ফাইলের আশা করা উচিত নয়, তবে আমরা যদি কিছু পরীক্ষা করে নিই তবে এটি থাকা সহজ। তবে যাইহোক, পাছে না কিছু ডিফল্ট ইনলাইন সরবরাহ করে, সুতরাং settings/base.py
সেই অনুযায়ী প্রতিক্রিয়া জানাতে পারে।
environ.Env.read_env(Path(__file__) / "production.env", DEBUG='False', ASSETS_DEBUG='False')
from .base import *
এখানে আগ্রহের মূল বিষয় হ'ল DEBUG
এবং ASSETS_DEBUG
ওভাররাইডগুলি, সেগুলি অজগরটিতে প্রয়োগ করা হবেos.environ
পরিবেশ এবং ফাইল থেকে মিস করা থাকলে কেবলমাত্র অজগরটিতে হবে।
এগুলি হবে আমাদের উত্পাদন ডিফল্ট, পরিবেশ বা ফাইলে এগুলি রাখার দরকার নেই, তবে প্রয়োজনে সেগুলি ওভাররাইড করা যেতে পারে। ঝরঝরে!
সেটিংস / base.py
এগুলি আপনার বেশিরভাগ ভ্যানিলা জাঙ্গো সেটিংস, কিছু শর্তযুক্ত এবং প্রচুর পরিবেশ থেকে সেগুলি পড়ার সাথে with প্রায় সমস্ত কিছুই এখানে রয়েছে, সমস্ত উদ্দেশ্যযুক্ত পরিবেশকে সঙ্গতিপূর্ণ এবং যতটা সম্ভব সাদৃশ্য রেখে।
মূল পার্থক্যগুলি নীচে রয়েছে (আমি আশা করি এটি স্ব স্ব ব্যাখ্যাযোগ্য):
import environ
# https://github.com/joke2k/django-environ
env = environ.Env()
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# Where BASE_DIR is a django source root, ROOT_DIR is a whole project root
# It may differ BASE_DIR for eg. when your django project code is in `src` folder
# This may help to separate python modules and *django apps* from other stuff
# like documentation, fixtures, docker settings
ROOT_DIR = BASE_DIR
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env('DEBUG', default=False)
INTERNAL_IPS = [
'127.0.0.1',
]
ALLOWED_HOSTS = []
if 'ALLOWED_HOSTS' in os.environ:
hosts = os.environ['ALLOWED_HOSTS'].split(" ")
BASE_URL = "https://" + hosts[0]
for host in hosts:
host = host.strip()
if host:
ALLOWED_HOSTS.append(host)
SECURE_SSL_REDIRECT = env.bool('SECURE_SSL_REDIRECT', default=False)
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
if "DATABASE_URL" in os.environ: # pragma: no cover
# Enable database config through environment
DATABASES = {
# Raises ImproperlyConfigured exception if DATABASE_URL not in os.environ
'default': env.db(),
}
# Make sure we use have all settings we need
# DATABASES['default']['ENGINE'] = 'django.contrib.gis.db.backends.postgis'
DATABASES['default']['TEST'] = {'NAME': os.environ.get("DATABASE_TEST_NAME", None)}
DATABASES['default']['OPTIONS'] = {
'options': '-c search_path=gis,public,pg_catalog',
'sslmode': 'require',
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
# 'ENGINE': 'django.contrib.gis.db.backends.spatialite',
'NAME': os.path.join(ROOT_DIR, 'data', 'db.dev.sqlite3'),
'TEST': {
'NAME': os.path.join(ROOT_DIR, 'data', 'db.test.sqlite3'),
}
}
}
STATIC_ROOT = os.path.join(ROOT_DIR, 'static')
# django-assets
# http://django-assets.readthedocs.org/en/latest/settings.html
ASSETS_LOAD_PATH = STATIC_ROOT
ASSETS_ROOT = os.path.join(ROOT_DIR, 'assets', "compressed")
ASSETS_DEBUG = env('ASSETS_DEBUG', default=DEBUG) # Disable when testing compressed file in DEBUG mode
if ASSETS_DEBUG:
ASSETS_URL = STATIC_URL
ASSETS_MANIFEST = "json:{}".format(os.path.join(ASSETS_ROOT, "manifest.json"))
else:
ASSETS_URL = STATIC_URL + "assets/compressed/"
ASSETS_MANIFEST = "json:{}".format(os.path.join(STATIC_ROOT, 'assets', "compressed", "manifest.json"))
ASSETS_AUTO_BUILD = ASSETS_DEBUG
ASSETS_MODULES = ('website.assets',)
শেষ বিট এখানে শক্তি দেখায়। ASSETS_DEBUG
একটি বুদ্ধিমান ডিফল্ট আছে, যা ওভাররাইড করা যেতে পারে settings/production.py
এমনকি এটি একটি পরিবেশ সেটিং দ্বারা ওভাররাইড করা যেতে পারে! হ্যাঁ!
বাস্তবে আমাদের কাছে গুরুত্বের একটি মিশ্র শ্রেণিবিন্যাস রয়েছে:
- সেটিংস / .py - উদ্দেশ্য ভিত্তিতে ডিফল্ট সেট করে, গোপন সংরক্ষণ করে না
- সেটিংস / বেস.পি - বেশিরভাগ পরিবেশ দ্বারা নিয়ন্ত্রিত হয়
- পরিবেশের সেটিংস প্রক্রিয়া - 12 ফ্যাক্টর বাচ্চা!
- সেটিংস / .env - সহজ সূচনার জন্য স্থানীয় ডিফল্ট