Django में स्थानीय बनाम उत्पादन सेटिंग्स कैसे प्रबंधित करें?


298

स्थानीय विकास और उत्पादन सर्वर के लिए सेटिंग्स को संभालने का अनुशंसित तरीका क्या है? उनमें से कुछ (जैसे स्थिरांक, आदि) दोनों में परिवर्तित / एक्सेस किए जा सकते हैं, लेकिन उनमें से कुछ (जैसे स्थिर फ़ाइलों के लिए पथ) को अलग रहने की आवश्यकता होती है, और इसलिए हर बार नए कोड को तैनात किए जाने पर इसे अधिलेखित नहीं किया जाना चाहिए।

वर्तमान में, मैं सभी स्थिरांक जोड़ रहा हूँ settings.py। लेकिन हर बार जब मैं स्थानीय स्तर पर कुछ बदलाव करता हूं, तो मुझे इसे उत्पादन सर्वर पर कॉपी करना होगा और उत्पादन विशिष्ट परिवर्तनों के लिए फाइल को संपादित करना होगा ... :(

संपादित करें: ऐसा लगता है कि इस प्रश्न का कोई मानक उत्तर नहीं है, मैंने सबसे लोकप्रिय तरीका स्वीकार कर लिया है।



कृपया django-configurations पर एक नज़र डालें ।
JJD

2
स्वीकृत पद्धति अब सबसे लोकप्रिय नहीं है।
डैनियल

2
django- विभाजन-सेटिंग का उपयोग करना बहुत आसान है। इसे किसी भी डिफ़ॉल्ट सेटिंग्स को फिर से लिखने की आवश्यकता नहीं है।
सोबोलेवन

yo को बेसब्रीक फाइल और आपके स्थानीय थिंकपैड "से .base इंपोर्ट *" का उपयोग करना चाहिए, आपके प्रोडक्शनहोम में ".base इंपोर्ट *" से समान, आपको अपने प्रोजेक्ट को चलाने की जरूरत है: python manage.py runserver - के साथ। सेटिंग्स = project_name.settings.local
Roberth सोलिस

जवाबों:


127

इन settings.py:

try:
    from local_settings import *
except ImportError as e:
    pass

आप की जरूरत है क्या में ओवरराइड कर सकते हैं local_settings.py; यह आपके संस्करण नियंत्रण से बाहर रहना चाहिए। लेकिन जब से आप नकल का उल्लेख करते हैं मैं अनुमान लगा रहा हूं कि आप कोई भी उपयोग नहीं करते हैं;)


3
नई सेटिंग्स की ट्रैकिंग / परिनियोजन को आसान बनाने के लिए, उत्पादन / परीक्षण मशीनों और विकास पर कोई भी "local_settings.py" का उपयोग न करें।
जॉन मि।

8
इस तरह से मैं कर रहा हूँ - सेटिंग्स के अंत में उन पंक्तियों को जोड़ना ताकि वे डिफ़ॉल्ट सेटिंग्स को ओवरराइड कर सकें
daonb

61
इस दृष्टिकोण का अर्थ है कि आपके पास विकास और उत्पादन में चल रहा कोड नहीं है। और हर डेवलपर का एक अलग कोड आधार होता है। मैं यहां एंटी-पैटर्न कहता हूं।
pydanny

8
@pydanny समस्या यह है कि Django स्टोर यह .py फ़ाइल में कॉन्फ़िगरेशन है। आप उम्मीद नहीं कर सकते कि सभी डेवलपर्स और प्रोडक्शन सर्वर एक ही सेटिंग का उपयोग करेंगे, इसलिए आपको इस .py फ़ाइल को बदलने या कुछ वैकल्पिक समाधान (.ini फाइलें, पर्यावरण आदि) को लागू करने की आवश्यकता है।
तुप्तेक

3
मैं मॉड्यूल settings_localको कॉल करना पसंद करता हूं क्योंकि local_settingsइसे settings.pyवर्णानुक्रमिक फ़ोल्डर लिस्टिंग के साथ समूहित करने के लिए विरोध किया जाता है । settings_local.pyसंस्करण नियंत्रण से बाहर रखें .gitignoreक्योंकि क्रेडेंशियल्स Git से संबंधित नहीं हैं। कल्पना कीजिए कि दुर्घटना से उनकी सोर्सिंग खुली होगी। मैं settings_local.py.txtइसके बजाय एक टेम्पलेट फ़ाइल git में रखता हूं ।
लाइन ब्रेक

297

Django के दो स्कूप्स: Django 1.5 के लिए सर्वश्रेष्ठ अभ्यास आपकी सेटिंग्स फ़ाइलों के लिए संस्करण नियंत्रण का उपयोग करने और फ़ाइलों को एक अलग फ़ाइल में संग्रहीत करने का सुझाव देता है:

project/
    app1/
    app2/
    project/
        __init__.py
        settings/
            __init__.py
            base.py
            local.py
            production.py
    manage.py

base.pyफ़ाइल है, जबकि (जैसे MEDIA_ROOT या व्यवस्थापक के रूप में) आम सेटिंग होती हैं local.pyऔर production.pyसाइट-विशिष्ट सेटिंग है:

आधार फ़ाइल में settings/base.py:

INSTALLED_APPS = (
    # common apps...
)

स्थानीय विकास सेटिंग फ़ाइल में settings/local.py:

from project.settings.base import *

DEBUG = True
INSTALLED_APPS += (
    'debug_toolbar', # and other apps for local development
)

फ़ाइल उत्पादन सेटिंग्स फ़ाइल में settings/production.py:

from project.settings.base import *

DEBUG = False
INSTALLED_APPS += (
    # other apps for production site
)

जब आप django चलाते हैं, तो आप --settingsविकल्प जोड़ते हैं :

# Running django for local development
$ ./manage.py runserver 0:8000 --settings=project.settings.local

# Running django shell on the production site
$ ./manage.py shell --settings=project.settings.production

पुस्तक के लेखकों ने जीथब पर एक नमूना परियोजना लेआउट टेम्पलेट भी रखा है ।


62
ध्यान दें कि --settingsहर बार उपयोग करने के बजाय , आप DJANGO_SETTINGS_MODULEenvvar सेट कर सकते हैं । यह अच्छी तरह से काम करता है, उदाहरण के लिए, हरोकू: इसे विश्व स्तर पर उत्पादन के लिए सेट करें, फिर इसे अपने .env फ़ाइल में देव के साथ ओवरराइड करें।
साइमन वेबर

9
DJANGO_SETTINGS_MODULEEnv var का उपयोग करना यहाँ सबसे अच्छा विचार है, धन्यवाद साइमन।
किबिबू

20
आपको BASE_DIRसेटिंग्स को बदलने की आवश्यकता हो सकती हैos.path.dirname(os.path.realpath(os.path.dirname(__file__) + "/.."))
पेट्र पेलर

5
django डॉक्स के अनुसार @rsp, आप आयात करते हैं from django.conf import settingsजो एक इंटरफ़ेस है जो इंटरफ़ेस को अमूर्त करता है और सेटिंग्स के स्थान से कोड को डिकोड करता है

3
यदि मैं एक पर्यावरण चर के माध्यम से DJANGO_SETTINGS_MODULE सेट करता हूं, तो क्या मुझे अभी भी अपनी wsgi.py फ़ाइल में os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "projectname.settings.production") की आवश्यकता है? इसके अलावा, मैंने पर्यावरणीय संस्करण का उपयोग करके सेट किया है: निर्यात करें DJANGO_SETTINGS_MODULE = projectname.settings.local, लेकिन तब यह खो जाता है जब मैं टर्मिनल बंद कर देता हूं। मैं यह सुनिश्चित करने के लिए क्या कर सकता हूं कि यह सहेजा गया है? क्या मुझे उस लाइन को bashrc फ़ाइल में जोड़ना चाहिए?
Kritz

71

इसके बजाय settings.py, इस लेआउट का उपयोग करें:

.
└── settings/
    ├── __init__.py  <= not versioned
    ├── common.py
    ├── dev.py
    └── prod.py

common.py वह जगह है जहाँ आपका अधिकांश कॉन्फ़िगरेशन रहता है।

prod.py आम से सब कुछ आयात करता है, और जो कुछ भी इसे ओवरराइड करने की आवश्यकता है उसे ओवरराइड करता है:

from __future__ import absolute_import # optional, but I like it
from .common import *

# Production overrides
DEBUG = False
#...

इसी तरह, dev.pyसब कुछ आयात करता है common.pyऔर जो कुछ भी इसे ओवरराइड करने की आवश्यकता होती है उसे ओवरराइड करता है।

अंत में, __init__.pyजहां आप यह तय करते हैं कि कौन सी सेटिंग्स को लोड करना है, और यह वह जगह भी है जहां आप रहस्यों को स्टोर करते हैं (इसलिए इस फाइल को संस्करणित नहीं किया जाना चाहिए):

from __future__ import absolute_import
from .prod import *  # or .dev if you want dev

##### DJANGO SECRETS
SECRET_KEY = '(3gd6shenud@&57...'
DATABASES['default']['PASSWORD'] = 'f9kGH...'

##### OTHER SECRETS
AWS_SECRET_ACCESS_KEY = "h50fH..."

इस समाधान के बारे में मुझे क्या पसंद है:

  1. सब कुछ आपके संस्करण प्रणाली में है, रहस्यों को छोड़कर
  2. अधिकांश कॉन्फ़िगरेशन एक ही स्थान पर है common.py:।
  3. उत्पादक-विशिष्ट चीजें अंदर जाती हैं prod.py, देव-विशिष्ट चीजें अंदर जाती हैं dev.py। यह आसान है।
  4. आप से सामान ओवरराइड कर सकते हैं common.pyमें prod.pyया dev.py, और तुम में कुछ भी ओवरराइड कर सकते हैं __init__.py
  5. यह सीधा अजगर है। कोई पुन: आयात हैक नहीं।

2
मैं अभी भी यह पता लगाने की कोशिश कर रहा हूं कि सेटिंग फ़ाइल के लिए मेरे प्रोजेक्टवॉगी और मैनेजमेख फाइलों में क्या सेट करना है। क्या आप इस पर कुछ प्रकाश डालेंगे? विशेष रूप से, मेरी प्रबंधित फ़ाइल में मेरे पास os.environ.setdefault("DJANGO_SETTINGS_MODULE", "foobar.settings")फ़ॉबर है एक __init__.pyफ़ाइल के साथ एक फ़ोल्डर है और सेटिंग्स एक फ़ोल्डर है जिसमें एक __init__.pyफ़ाइल है जिसमें मेरा रहस्य है और यह देवडोम आयात करता है, जो फिर सामान्य रूप से आयात करता है। EDIT नेवरमाइंड, मेरे पास एक मॉड्यूल स्थापित नहीं था जो आवश्यक था। मेरी गलती! यह महान काम करता है !!
तेवुआएन

5
दो बातें: 1) डिबग सेट करने के लिए बेहतर है = अपने prod.py के बजाय = अपने dev.py में सही। 2) init .py पर स्विच करने के बजाय , DJANGO_SETTINGS_MODULE वातावरण var का उपयोग करके स्विच करें। यह पीएएएस तैनाती (जैसे हरोकू) के साथ मदद करेगा।
रोब ग्रांट

जब मैं django 1.8.4 में इस सेटअप का उपयोग करता हूं और रनर सेवर करता हूं तो मुझे "django.core.exception.ImproperlyConfigured: SECRET_KEY सेटिंग खाली नहीं होनी चाहिए।", यहां तक ​​कि doh के पास मेरे init .py फाइल पर SECRET_KEY है । क्या मैं कुछ भूल रहा हूँ?
पोलरकेयर

AWS_SECRET_ACCESS_KEY = os.getenv ("AWS_SECRET_ACCESS_KEY") जैसी चीज़ों का उपयोग अधिक सुरक्षित नहीं है? ईमानदार सवाल - मुझे पता है कि आप इसे संस्करणबद्ध क्यों नहीं करना चाहते हैं, लेकिन दूसरा विकल्प यह है कि इसे पर्यावरण से प्राप्त किया जाए। जो निश्चित रूप से पर्यावरण चर को स्थापित करने के सवाल पर भीगता है, लेकिन यह आपके तैनाती तंत्र पर छोड़ा जा सकता है, नहीं?
JL Peyret

20

मैं "अगर DEBUG" सेटिंग्स का थोड़ा संशोधित संस्करण का उपयोग करता हूं जो हार्पर शेल्बी ने पोस्ट किया है। स्पष्ट रूप से पर्यावरण (जीत / linux / etc।) के आधार पर कोड को थोड़ा मोड़ने की आवश्यकता हो सकती है।

मैं "यदि DEBUG" का उपयोग करने के अतीत में था, लेकिन मैंने पाया कि कभी-कभी मुझे DEUBG के साथ परीक्षण करने की आवश्यकता होती है जो कि गलत है। अगर पर्यावरण उत्पादन या विकास था, तो मैं वास्तव में अलग करना चाहता था, जिसने मुझे DEBUG स्तर चुनने की स्वतंत्रता दी।

PRODUCTION_SERVERS = ['WEBSERVER1','WEBSERVER2',]
if os.environ['COMPUTERNAME'] in PRODUCTION_SERVERS:
    PRODUCTION = True
else:
    PRODUCTION = False

DEBUG = not PRODUCTION
TEMPLATE_DEBUG = DEBUG

# ...

if PRODUCTION:
    DATABASE_HOST = '192.168.1.1'
else:
    DATABASE_HOST = 'localhost'

मैं अभी भी सेटिंग्स के इस तरीके पर एक कार्य प्रगति पर विचार करूंगा। मैंने Django सेटिंग्स को संभालने का कोई एक तरीका नहीं देखा है जो सभी ठिकानों को कवर करता है और एक ही समय में सेटअप के लिए कुल परेशानी नहीं थी (मैं 5x सेटिंग्स फ़ाइलों के तरीकों के साथ नीचे नहीं हूं)।


यह इस तरह की बात है कि Django की सेटिंग्स एक वास्तविक कोड फ़ाइल की अनुमति देती है, और मैं इशारा कर रहा था। मैंने खुद ऐसा कुछ नहीं किया है, लेकिन यह निश्चित रूप से समाधान की तरह है जो मेरा एक बेहतर सामान्य उत्तर हो सकता है।
हार्पर शेल्बी

3
मैं सिर्फ पहली बार इस में भाग गया और अपने हल का उपयोग (सफलतापूर्वक!) करने के लिए चुना, थोड़ा अंतर के साथ: मैंने अपने सिस्टम के uid को खोजने के लिए uuid.getnode () का उपयोग किया। तो मैं परीक्षण कर रहा हूँ अगर uuid.getnode () == 12345678901 (वास्तव में एक अलग संख्या) आपके द्वारा उपयोग किए गए os.environ परीक्षण के बजाय। मुझे यह समझाने के लिए डॉक्यूमेंटेशन नहीं मिला कि os.environ ['COMPUTERNAME'] प्रति कंप्यूटर अद्वितीय है।
जो गोलटन

os.environ ['COMPUTERNAME'] अमेज़न AWS उबंटू पर काम नहीं करता है। मुझे एक KeyError मिलती है।
nu सदाबहार

यूयूआईडी का उपयोग करते समय यह समाधान मेरे लिए सबसे अच्छा और सरल साबित हुआ है। इसके लिए बहुत सारे जटिल और अति-संशोधित पैचवर्क की आवश्यकता नहीं है। उत्पादन परिवेश में, आपको अभी भी अपने डेटाबेस पासवर्ड और SECRET_KEY को एक अलग फ़ाइल में रखना होगा जो संस्करण नियंत्रण के बाहर रहता है।
एनयू एवरेस्ट

os.environ['COMPUTERNAME']दुर्भाग्य से PythonAnywhere पर काम नहीं करता है। आपको एक KeyError मिलती है।
नबीचट

14

मैं एक settings_local.py और एक settings_production.py का उपयोग करता हूं। कई विकल्पों को आज़माने के बाद मैंने पाया है कि जटिल समाधानों के साथ समय बर्बाद करना आसान है जब बस दो सेटिंग्स फ़ाइलों को आसान और तेज़ लगता है।

जब आप अपने Django प्रोजेक्ट के लिए mod_python / mod_wsgi का उपयोग करते हैं, तो आपको इसे अपनी सेटिंग फ़ाइल में इंगित करना होगा। यदि आप इसे अपने स्थानीय सर्वर पर app / settings_local.py पर इंगित करते हैं और अपने उत्पादन सर्वर पर app / settings_production.py तो जीवन आसान है। बस उपयुक्त सेटिंग्स फ़ाइल को संपादित करें और सर्वर को पुनः आरंभ करें (Django विकास सर्वर स्वचालित रूप से पुनरारंभ होगा)।


2
और स्थानीय विकास सर्वर के बारे में क्या? वहाँ django वेबसर्वर (चलाने का उपयोग कर python manage.py runserver), जो सेटिंग्स फ़ाइल का उपयोग करने के लिए कहने का एक तरीका है ?
akv

2
@akv अगर आप रनर्सएवर कमांड के अंत में --settings = [मॉड्यूल नाम] (कोई भी .py एक्सटेंशन) नहीं जोड़ते हैं, तो आप निर्दिष्ट कर सकते हैं कि कौन सी सेटिंग्स फ़ाइल का उपयोग करना है। यदि आप ऐसा करने जा रहे हैं, तो अपने आप को एक एहसान करें और शेल स्क्रिप्ट / बैच फ़ाइल को कॉन्फ़िगर की गई विकास सेटिंग्स के साथ बनाएं। मेरा विश्वास करो, आपकी उंगलियां आपको धन्यवाद देंगी।
टी। स्टोन

यह मेरे द्वारा उपयोग किया जाने वाला समाधान है। उत्पादन या विकास दोनों के लिए उपयोग की जाने वाली सेटिंग्स फ़ाइल को हैक करना गड़बड़ है
जॉर्ज गोडिक

4
मुझे लगता है कि विकास में settings.py का उपयोग करना बेहतर है, क्योंकि आपको इसे हर समय निर्दिष्ट करने की आवश्यकता नहीं है।
आंद्रे बोसार्ड

क्या मैं यह मानने में सही हूँ कि प्रॉक्सी, django.conf.settings के माध्यम से सेटिंग्स मॉड्यूल के आयात की आवश्यकता है? अन्यथा आपको लाइव पुश करते समय सही सेटिंग्स फ़ाइल पर इंगित करने के लिए आयात घोषणाओं को संपादित करने की आवश्यकता होगी।
ग्रोडी

8

टीएल; डीआर: चाल किसी में भी os.environmentआयात करने से पहले संशोधित करने के लिए है , यह चीजों को बहुत सरल करेगा।settings/base.pysettings/<purpose>.py


बस इन सभी इंटरवेटिंग फाइलों के बारे में सोचने से मुझे सिरदर्द होता है। संयोजन करना, आयात करना (कभी-कभी सशर्त रूप से), ओवरराइडिंग, पहले से ही मामले की DEBUGसेटिंग में जो कुछ भी सेट किया गया था उसे बाद में बदलना। कितना बुरा सपना!

वर्षों से मैं सभी अलग-अलग समाधानों के माध्यम से गया। वे सभी कुछ काम करते हैं, लेकिन प्रबंधन करने के लिए बहुत दर्दनाक हैं। WTF! क्या हमें वास्तव में उस परेशानी की आवश्यकता है? हमने सिर्फ एक settings.pyफाइल से शुरुआत की । अब हमें सही क्रम में इन सभी को एक साथ संयोजित करने के लिए एक दस्तावेज की आवश्यकता है!

मुझे आशा है कि मैं अंत में (मेरे) मीठे स्थान को नीचे दिए गए समाधान के साथ मारूंगा।

आइए लक्ष्यों को पुन: लागू करें (कुछ सामान्य, कुछ मेरा)

  1. रहस्यों को गुप्त रखें - उन्हें रेपो में संग्रहीत न करें!

  2. पर्यावरण सेटिंग्स, 12 कारक शैली के माध्यम से कुंजी और रहस्य सेट / पढ़ें ।

  3. समझदार कमियां है चूक। आदर्श रूप से स्थानीय विकास के लिए आपको चूक के अलावा और कुछ भी करने की आवश्यकता नहीं है।

  4. … लेकिन उत्पादन को सुरक्षित रखने की कोशिश करें। उत्पादन के लिए सुरक्षित डिफ़ॉल्ट सेटिंग्स को समायोजित करने के लिए याद रखने की तुलना में, स्थानीय रूप से एक सेटिंग ओवरराइड को याद करना बेहतर है।

  5. DEBUGएक तरह से चालू / बंद करने की क्षमता है जो अन्य सेटिंग्स पर प्रभाव डाल सकती है (जैसे कि जावास्क्रिप्ट संपीड़ित का उपयोग करना या नहीं)।

  6. उद्देश्य सेटिंग्स के बीच स्विच करना, जैसे स्थानीय / परीक्षण / स्टेजिंग / उत्पादन, केवल DJANGO_SETTINGS_MODULEकुछ और पर आधारित होना चाहिए ।

  7. ... लेकिन पर्यावरण सेटिंग्स जैसे माध्यम से आगे के पैरामीटरकरण की अनुमति दें DATABASE_URL

  8. … उन्हें अलग-अलग उद्देश्य सेटिंग्स का उपयोग करने और स्थानीय स्तर पर उन्हें साइड से चलाने की अनुमति देता है, जैसे। उत्पादन डेटाबेस या धूम्रपान परीक्षण संपीड़ित स्टाइल शीट तक पहुंचने के लिए स्थानीय डेवलपर मशीन पर उत्पादन सेटअप।

  9. यदि कोई पर्यावरण चर स्पष्ट रूप से सेट नहीं किया जाता है (न्यूनतम मूल्य पर खाली मूल्य की आवश्यकता होती है), विशेष रूप से उत्पादन में, जैसे। EMAIL_HOST_PASSWORD

  10. Django-admin startproject केDJANGO_SETTINGS_MODULE दौरान manage.py में डिफ़ॉल्ट सेट का जवाब दें

  11. , एक न्यूनतम करने के लिए सशर्त रखें अगर हालत है यह मकसद पर्यावरण, जुड़े ठान लिया सेटिंग्स फ़ाइल में ओवरराइड सेटिंग्स (उत्पादन सेट लॉग फ़ाइल और यह के रोटेशन के लिए जैसे।) लिखें।

नहीं है

  1. Django को DJANGO_SETTINGS_MODULE सेटिंग फ़ाइल के रूप में पढ़ने न दें।
    ओह! यह कैसे मेटा है यह सोचें। यदि आपको एक फाइल करने की आवश्यकता है (जैसे docker env) एक django प्रक्रिया को शुरू करने से पहले पर्यावरण में पढ़ें।

  2. अपने प्रोजेक्ट / ऐप कोड में DJANGO_SETTINGS_MODULE को ओवरराइड न करें, जैसे। होस्टनाम या प्रक्रिया के नाम पर आधारित है।
    यदि आप पर्यावरण चर (जैसे के लिए setup.py test) सेट करने के लिए आलसी हैं तो अपना प्रोजेक्ट कोड चलाने से पहले इसे टूलिंग में करें।

  3. जादू से बचें और कैसे django पढ़ता है यह सेटिंग्स है, सेटिंग्स को प्रीप्रोसेस करें लेकिन बाद में हस्तक्षेप न करें।

  4. कोई जटिल तर्क आधारित बकवास नहीं। कॉन्फ़िगरेशन को ठीक किया जाना चाहिए और मक्खी पर गणना नहीं की जानी चाहिए। एक कमबैक चूक प्रदान करना यहां पर्याप्त तर्क है।
    क्या आप वास्तव में डिबग करना चाहते हैं, क्यों स्थानीय स्तर पर आपके पास सेटिंग्स का सही सेट है लेकिन एक रिमोट सर्वर पर उत्पादन में, एक सौ मशीनों पर, कुछ अलग तरह से गणना की जाती है? ओह! यूनिट परीक्षण? सेटिंग्स के लिए? गंभीरता से?

समाधान

मेरी रणनीति में उत्कृष्ट django-environini शैली फ़ाइलों के साथ उपयोग किया जाता है , os.environmentस्थानीय विकास के लिए चूक प्रदान करता है, कुछ न्यूनतम और छोटी settings/<purpose>.pyफाइलें जो एक import settings/base.py AFTERos.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केवल अजगर पर लागू होंगे यदि वे पर्यावरण और फ़ाइल से MISSING कर रहे हैं।

ये हमारी प्रोडक्शन डिफॉल्ट होंगी, इन्हें पर्यावरण या फाइल में डालने की जरूरत नहीं है, लेकिन जरूरत पड़ने पर इन्हें ओवरराइड किया जा सकता है। साफ!

सेटिंग्स / base.py

ये आपकी ज्यादातर वैनिला django सेटिंग्स हैं, जिनमें कुछ सशर्त हैं और बहुत कुछ उन्हें पर्यावरण से पढ़ना है। लगभग सब कुछ यहाँ है, सभी वातावरण को बनाए रखने के समान और यथासंभव।

मुख्य अंतर नीचे हैं (मुझे आशा है कि ये आत्म व्याख्यात्मक हैं):

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और यहां तक ​​कि पर्यावरण सेटिंग द्वारा इसे ओवरराइड किया जा सकता है! वाह!

वास्तव में हमारे पास महत्व का एक मिश्रित पदानुक्रम है:

  1. सेटिंग्स / .py - उद्देश्य के आधार पर चूक सेट करता है, रहस्यों को संग्रहीत नहीं करता है
  2. सेटिंग / बेस-थ्रू - अधिकतर पर्यावरण द्वारा नियंत्रित होती है
  3. प्रक्रिया पर्यावरण सेटिंग्स - 12 कारक बच्चे!
  4. सेटिंग्स / .env - आसान स्टार्टअप के लिए स्थानीय चूक

हे Janusz ... तो .env फ़ाइल में सभी API कुंजियाँ और विशेषाधिकार कुंजी और पासवर्ड आदि जाएंगे? जैसे TWILLIO_API = "abc123"? या TWILLIO_API = env ("TWILLIO_API")?
dbinott

हां, लेकिन यह पर्यावरण सेटिंग के लिए केवल एक गिरावट है। यह फ़ाइल विकास के लिए काम आती है, लेकिन रेपो में सहेजी नहीं जाती है या उत्पादन के लिए धकेल दी जाती है, जहां आपको पर्यावरण सेटिंग्स या आपके प्लेटफ़ॉर्म के समान कड़ाई से उपयोग करना चाहिए जो सर्वर प्रक्रिया के लिए पर्यावरण सेटिंग्स को सेट करेगा।
Janusz Skonieczny

7

मैं django-विभाजित-सेटिंग्स की मदद से अपने कॉन्फ़िगरेशन का प्रबंधन करता हूं ।

यह डिफ़ॉल्ट सेटिंग्स के लिए एक ड्रॉप-इन प्रतिस्थापन है। यह सरल है, फिर भी विन्यास योग्य है। और आपके एक्सिसिटिंग सेटिंग्स को फिर से भरने की आवश्यकता नहीं है।

यहाँ एक छोटा सा उदाहरण (फ़ाइल example/settings/__init__.py) है:

from split_settings.tools import optional, include
import os

if os.environ['DJANGO_SETTINGS_MODULE'] == 'example.settings':
    include(
        'components/default.py',
        'components/database.py',
        # This file may be missing:
        optional('local_settings.py'),

        scope=globals()
    )

बस।

अपडेट करें

मैं के साथ सेटिंग्स के प्रबंधन के बारे में एक ब्लॉग पोस्ट लिखा था । एक नज़र देख लो!djangodjango-split-sttings


1
मैं एक दीवार में है कि .. भाग गया करने की कोशिश की एक बार मैं अपने Django इकाई परीक्षण भागने की कोशिश की .. मैं सिर्फ यह पता लगाने नहीं कर सकता है कि कौन सी सेटिंग फ़ाइल को पढ़ने के लिए निर्दिष्ट करने का तरीका से
abbood

मैंने आपके लिए एक जिस्ट
sobolevn

मैं की तरह कुछ मिल गया यह मेरी कोड में, तो मैं settings.DEBUG झंडा जाँच पता करने के लिए अगर मैं सामान आयात करना चाहते हैं .. कि झंडा हमेशा असत्य पर Django इकाई परीक्षण में (देखें सेट किया गया है यहाँ ) तो मेरे काम के आसपास उन पर ओवरराइड करने के लिए है की तरह प्रत्येक परीक्षा तो
abbood

यहाँ एक और सवाल है, हालांकि: मेरी uwsgi.iniफ़ाइल में देव / ठिकानों की अलग-अलग सेटिंग्स हैं .. किसी भी विचार से कि यह मेरी सेटिंग्स फ़ाइल से मान कैसे ले सकता है?
बजे

क्षमा करें, मुझे सेटअप नहीं मिला। आप अधिक विवरण के साथ एक अलग सवाल पूछ सकते हैं और मैं आपकी मदद करने की कोशिश करूंगा।
सोबोलेवन

6

इन समाधानों में से अधिकांश के साथ समस्या यह है कि आपके पास या तो अपनी स्थानीय सेटिंग्स आम लोगों के सामने लागू होती हैं, या उनके बाद

तो जैसे चीजों को ओवरराइड करना असंभव है

  • एमवी-विशिष्ट सेटिंग्स मेम्केच्ड पूल के लिए पतों को परिभाषित करती हैं, और मुख्य सेटिंग्स फ़ाइल में इस मान का उपयोग कैश वेंड को कॉन्फ़िगर करने के लिए किया जाता है
  • env-specific settings डिफ़ॉल्ट रूप से ऐप्स / मिडलवेयर को जोड़ती या हटाती है

एक ही समय में।

एक समाधान "आईएनआई" का उपयोग करके कार्यान्वित किया जा सकता है-विन्यास फाइल को विन्यासकर्ता वर्ग के साथ। यह कई फ़ाइलों, आलसी स्ट्रिंग प्रक्षेप, डिफ़ॉल्ट मानों और कई अन्य अच्छाइयों का समर्थन करता है। एक बार कई फाइलें लोड हो जाने के बाद, अधिक फाइलें लोड की जा सकती हैं और उनका मान पिछले वाले को ओवरराइड करेगा, यदि कोई हो।

आप पहले से भरी हुई कॉन्फ़िगर फ़ाइलों में मशीन के पते, पर्यावरण चर और यहां तक ​​कि मूल्यों के आधार पर एक या अधिक कॉन्फिग फाइल लोड करते हैं। तब आप सेटिंग्स को पॉप्युलेट करने के लिए बस पार्स किए गए मानों का उपयोग करते हैं।

एक रणनीति जिसका मैंने सफलतापूर्वक उपयोग किया है:

  • एक डिफ़ॉल्ट defaults.iniफ़ाइल लोड करें
  • मशीन के नाम की जाँच करें, और सभी फाइलों को लोड करें जो उल्टे एफक्यूडीएन से मेल खाती हैं, सबसे कम मैच से लेकर सबसे लंबे मैच तक (इसलिए, मैंने लोड किया net.ini, फिर net.domain.ini, फिर net.domain.webserver01.ini, हर एक संभवतः पिछले के मानों को पछाड़ते हुए)। यह खाता डेवलपर्स की मशीनों के लिए भी है, इसलिए हर कोई स्थानीय विकास के लिए अपने पसंदीदा डेटाबेस ड्राइवर आदि को स्थापित कर सकता है
  • जांचें कि क्या कोई "क्लस्टर नाम" घोषित किया गया है, और उस स्थिति में लोड cluster.cluster_name.ini, जो डेटाबेस और कैश आईपी जैसी चीजों को परिभाषित कर सकता है

इसके साथ आप जो कुछ हासिल कर सकते हैं, उसके उदाहरण के रूप में, आप "सबडोमेन" मूल्य प्रति-एनवी को परिभाषित कर सकते हैं, जो तब डिफ़ॉल्ट सेटिंग्स में उपयोग किया जाता है (जैसा कि hostname: %(subdomain).whatever.net) सभी आवश्यक होस्टनाम और कुकी चीजों को परिभाषित करने के लिए django को काम करने की आवश्यकता है।

यह है जैसा कि DRY मैं प्राप्त कर सकता हूं, अधिकांश (मौजूदा) फाइलों में सिर्फ 3 या 4 सेटिंग्स थीं। इसके शीर्ष पर मुझे ग्राहक कॉन्फ़िगरेशन का प्रबंधन करना था, इसलिए कॉन्फ़िगरेशन फ़ाइलों का एक अतिरिक्त सेट (डेटाबेस नाम, उपयोगकर्ता और पासवर्ड, असाइन किए गए उपडोमेन आदि जैसी चीजों के साथ) मौजूद था, एक या अधिक प्रति ग्राहक।

एक इसे कम या अधिक के रूप में आवश्यक के रूप में उच्च कर सकते हैं, आप बस कॉन्फ़िगर फाइल को उन कुंजियों में डालते हैं जिन्हें आप प्रति-वातावरण कॉन्फ़िगर करना चाहते हैं, और एक बार नए कॉन्फ़िगरेशन की आवश्यकता होने पर, पिछले मान को डिफ़ॉल्ट कॉन्फ़िगरेशन में डाल दें, और इसे ओवरराइड करें। जहां आवश्यक हो।

यह प्रणाली विश्वसनीय साबित हुई है और संस्करण नियंत्रण के साथ अच्छी तरह से काम करती है। इसका उपयोग लंबे समय से अनुप्रयोगों के दो अलग-अलग समूहों के प्रबंधन के लिए किया गया है (प्रति मशीन django साइट के 15 या अधिक अलग-अलग उदाहरण), 50 से अधिक ग्राहकों के साथ, जहां क्लस्टर साइज़डमिन के मूड के आधार पर आकार और सदस्यों को बदल रहे थे। ।


1
क्या आपके पास एक उदाहरण है कि आप इनिंग से Django की सेटिंग में कैसे लोड करते हैं?
कलीसिन

Docs.python.org/2/library/configparser.html देखें । आप config = ConfigParser.ConfigParser() अपनी फ़ाइलों को पढ़ सकते हैं config.read(array_of_filenames)और उपयोग कर मान प्राप्त कर सकते हैं config.get(section, option)। इसलिए पहले आप अपना कॉन्फिगरेशन लोड करते हैं, और फिर आप सेटिंग्स के लिए मान पढ़ने के लिए इसका इस्तेमाल करते हैं।
फिर से लिखा

5

मैं लारवेल के साथ भी काम कर रहा हूं और मुझे वहां कार्यान्वयन पसंद है। मैंने इसे नकल करने की कोशिश की और टी। स्टोन द्वारा प्रस्तावित समाधान के साथ संयोजन किया (ऊपर देखें):

PRODUCTION_SERVERS = ['*.webfaction.com','*.whatever.com',]

def check_env():
    for item in PRODUCTION_SERVERS:
        match = re.match(r"(^." + item + "$)", socket.gethostname())
        if match:
            return True

if check_env():
    PRODUCTION = True
else:
    PRODUCTION = False

DEBUG = not PRODUCTION

शायद ऐसा कुछ आपकी मदद करे।


4

याद रखें कि settings.py एक लाइव कोड फ़ाइल है। यह मानते हुए कि आपके पास उत्पादन पर DEBUG सेट नहीं है (जो एक सर्वोत्तम अभ्यास है), आप कुछ ऐसा कर सकते हैं:

if DEBUG:
    STATIC_PATH = /path/to/dev/files
else:
    STATIC_PATH = /path/to/production/files

सुंदर बुनियादी, लेकिन आप सिद्धांत रूप में, DEBUG के मूल्य के आधार पर जटिलता के किसी भी स्तर तक जा सकते हैं - या किसी अन्य चर या कोड की जाँच करें जिसे आप उपयोग करना चाहते थे।


4

मेरी अधिकांश परियोजनाओं के लिए मैं निम्नलिखित पैटर्न का उपयोग करता हूं:

  1. जहाँ मैं सभी वातावरणों के लिए सामान्य सेटिंग्स सेट करता हूँ, वहां settings_base.py बनाएँ
  2. जब भी मुझे विशिष्ट आवश्यकताओं के साथ नए वातावरण का उपयोग करने की आवश्यकता होती है, तो मैं नई सेटिंग्स फ़ाइल बनाता हूं (जैसे। settings_local.py), जो settings_base.py की सामग्री और ओवरराइड्स की सामग्री को इनहेरिट करता है / उचित सेटिंग्स चर जोड़ता है ( from settings_base import *)

(कस्टम सेटिंग्स के साथ manage.py चलाने के लिए आप बस --settings आदेश विकल्प का उपयोग फ़ाइल: manage.py <command> --settings=settings_you_wish_to_use.py)


3

उस समस्या का मेरा समाधान भी कुछ समाधानों का मिश्रण है जो पहले से ही यहां दिए गए हैं:

  • मैं एक फाइल रखता हूं local_settings.pyजिसमें USING_LOCAL = Trueदेव और सामग्री में सामग्री USING_LOCAL = Falseहै
  • में settings.pyमुझे लगता है कि फाइल पर एक आयात कर पाने के लिए USING_LOCALसेटिंग

मैं उस पर अपनी सभी पर्यावरण-निर्भर सेटिंग्स को आधार बनाता हूं:

DEBUG = USING_LOCAL
if USING_LOCAL:
    # dev database settings
else:
    # prod database settings

मैं इसे दो अलग-अलग सेटिंग्स करने के लिए पसंद करता हूं। मुझे उन फ़ाइलों को रखने की आवश्यकता है जो मुझे एक ही फाइल में संरचित कर सकती हैं क्योंकि वे कई फाइलों में फैली हुई हैं। इस तरह, जब मैं एक सेटिंग को अपडेट करता हूं तो मैं इसे दोनों वातावरणों के लिए करना नहीं भूलता।

बेशक कि हर विधि के अपने नुकसान हैं और यह कोई अपवाद नहीं है। यहाँ समस्या यह है कि local_settings.pyजब भी मैं उत्पादन में अपने बदलावों को आगे बढ़ाता हूँ तो मैं फ़ाइल को अधिलेखित नहीं कर सकता , जिसका अर्थ है कि मैं सभी फ़ाइलों को आँख बंद करके कॉपी नहीं कर सकता, लेकिन यह ऐसी चीज़ है जिसके साथ मैं रह सकता हूँ।


3

मैं ऊपर बताए गए जोपरोगी की भिन्नता का उपयोग करता हूं, जो मुझे थोड़ा छोटा लगता है:

import platform
from django.core.management import execute_manager 

computername = platform.node()

try:
  settings = __import__(computername + '_settings')
except ImportError: 
  import sys
  sys.stderr.write("Error: Can't find the file '%r_settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file local_settings.py does indeed exist, it's causing an ImportError somehow.)\n" % (computername, __file__))
  sys.exit(1)

if __name__ == "__main__":
  execute_manager(settings)

मूल रूप से प्रत्येक कंप्यूटर (विकास या उत्पादन) पर मेरे पास उपयुक्त hostname_settings.py फ़ाइल है जो गतिशील रूप से भरी हुई है।


3

इसमें Django Classy Settings भी है। मैं व्यक्तिगत रूप से इसका बहुत बड़ा प्रशंसक हूं। यह Django IRC पर सबसे सक्रिय लोगों में से एक द्वारा बनाया गया है। आप चीजों को सेट करने के लिए पर्यावरण के विभिन्न प्रकारों का उपयोग करेंगे।

http://django-classy-settings.readthedocs.io/en/latest/


3

1 - अपने ऐप के अंदर एक नया फ़ोल्डर बनाएं और उस पर नाम सेटिंग्स करें।

2 - अब इसमें एक नई __init__.pyफाइल बनाएं और उसके अंदर लिखें

from .base import *

try:
    from .local import *
except:
    pass

try:
    from .production import *
except:
    pass

3 - नाम फ़ोल्डर सेटिंग्स में तीन नई फ़ाइलें बनाएं local.pyऔर production.pyऔर base.py

4 - अंदर base.py, पिछले settings.pyफ़ोल्डर की सभी सामग्री की प्रतिलिपि बनाएँ और इसे कुछ अलग से नाम दें, आइए बताते हैं old_settings.py

5 - अपनी नई सेटिंग के लिए इंगित करने के लिए आधार में अपना BASE_DIR पथ बदलें

पुराना रास्ता-> BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

नया रास्ता -> BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

इस तरह, परियोजना की संरचना को संरचित किया जा सकता है और उत्पादन और स्थानीय विकास के बीच प्रबंधनीय हो सकता है।


2

settingsविभिन्न वातावरण पर विभिन्न कॉन्फ़िगरेशन का उपयोग करने के लिए , अलग सेटिंग्स फ़ाइल बनाएं। और अपनी तैनाती स्क्रिप्ट में, --settings=<my-settings.py>पैरामीटर का उपयोग करके सर्वर शुरू करें , जिसके माध्यम से आप विभिन्न वातावरण पर विभिन्न सेटिंग्स का उपयोग कर सकते हैं ।

इस दृष्टिकोण का उपयोग करने के लाभ :

  1. आपकी सेटिंग प्रत्येक वातावरण के आधार पर मॉड्यूलर होगी

  2. आप master_settings.pyआधार कॉन्फ़िगरेशन में आयात कर सकते हैं environmnet_configuration.pyऔर उन मानों को ओवरराइड कर सकते हैं जिन्हें आप उस वातावरण में बदलना चाहते हैं।

  3. यदि आपके पास विशाल टीम है, तो प्रत्येक डेवलपर के पास अपना स्वयं local_settings.pyका कोड हो सकता है जिसे वे सर्वर कॉन्फ़िगरेशन को संशोधित करने के किसी भी जोखिम के बिना कोड रिपॉजिटरी में जोड़ सकते हैं। .gitnoreयदि आप git का उपयोग करते हैं या .hginoreयदि आप संस्करण नियंत्रण (या किसी अन्य) के लिए Mercurial हैं , तो आप इन स्थानीय सेटिंग्स को जोड़ सकते हैं । इस तरह से स्थानीय सेटिंग्स भी वास्तविक कोड आधार का हिस्सा नहीं होंगी जो इसे साफ रखेगा।


2

मैंने अपनी सेटिंग्स इस प्रकार विभाजित की थी

settings/
     |
     |- base.py
     |- dev.py
     |- prod.py  

हमारे पास 3 वातावरण हैं

  • देव
  • मचान
  • उत्पादन

अब स्पष्ट रूप से मंचन और उत्पादन में अधिकतम संभव समान पर्यावरण होना चाहिए। इसलिए हम prod.pyदोनों के लिए रखा ।

लेकिन एक मामला था जहां मुझे रनिंग सर्वर की पहचान करनी थी एक प्रोडक्शन सर्वर है। @T। स्टोन के उत्तर ने मुझे निम्न प्रकार से जांच लिखने में मदद की।

from socket import gethostname, gethostbyname  
PROD_HOSTS = ["webserver1", "webserver2"]

DEBUG = False
ALLOWED_HOSTS = [gethostname(), gethostbyname(gethostname()),]


if any(host in PROD_HOSTS for host in ALLOWED_HOSTS):
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True  

1

मैं इसे प्रबंधित करने के लिए अलग-थलग कर देता हूँ और दो अलग-अलग सेटिंग फ़ाइल बनाता है: local_settings.py और prod_settings.py।

मैंने प्रबंधित किया है कि क्या सर्वर स्थानीय सर्वर या उत्पादन सर्वर है। यदि यह एक स्थानीय सर्वर है, तो यह local_settings.py को लोड करेगा और यह एक प्रोडक्शन सर्वर है, जो prod_settings.py को लोड करेगा। मूल रूप से यह है कि यह कैसा दिखेगा:

#!/usr/bin/env python
import sys
import socket
from django.core.management import execute_manager 

ipaddress = socket.gethostbyname( socket.gethostname() )
if ipaddress == '127.0.0.1':
    try:
        import local_settings # Assumed to be in the same directory.
        settings = local_settings
    except ImportError:
        import sys
        sys.stderr.write("Error: Can't find the file 'local_settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file local_settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
        sys.exit(1)
else:
    try:
        import prod_settings # Assumed to be in the same directory.
        settings = prod_settings    
    except ImportError:
        import sys
        sys.stderr.write("Error: Can't find the file 'prod_settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file prod_settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
        sys.exit(1)

if __name__ == "__main__":
    execute_manager(settings)

मैंने पाया कि सेटिंग्स फ़ाइल के अंदर बहुत सारे ifs करने के बजाय सेटिंग्स फ़ाइल को दो अलग फ़ाइल में अलग करना आसान है।


1

यदि आप wiil हैं तो अलग फाइल को बनाए रखने के विकल्प के रूप में: यदि आप स्थानीय से सर्वर पर कोड्स को पुश करने के लिए git या किसी अन्य VCS का उपयोग कर रहे हैं, तो आप जो कुछ भी कर सकते हैं, उसे .gitignore में सेटिंग्स फ़ाइल जोड़ सकते हैं।

यह आपको बिना किसी समस्या के दोनों स्थानों में अलग-अलग सामग्री रखने की अनुमति देगा। एसओ सर्वर पर आप सेटिंग्स के एक स्वतंत्र संस्करण को कॉन्फ़िगर कर सकते हैं और स्थानीय अभ्यस्त पर किए गए किसी भी परिवर्तन को सर्वर पर दर्शाते हैं और इसके विपरीत।

इसके अलावा, यह gitub से बड़ी फ़ाइल में भी सेटिंग्स को हटा देगा, जो कि मैंने कई newbies करते हुए देखा है।



0

मुझे लगता है कि सबसे अच्छा समाधान @ टी द्वारा सुझाया गया है। पत्थर, लेकिन मुझे नहीं पता कि सिर्फ Django में DEBUG ध्वज का उपयोग क्यों नहीं करते। मैं अपनी वेबसाइट के लिए निम्न कोड लिखूंगा:

if DEBUG:
    from .local_settings import *

हमेशा सरल समाधान जटिल लोगों की तुलना में बेहतर होते हैं।


-2

मुझे यहाँ प्रतिक्रियाएँ बहुत मददगार लगीं। (क्या यह अधिक निश्चित रूप से हल हो गया है? अंतिम प्रतिक्रिया एक साल पहले थी।) सूचीबद्ध सभी दृष्टिकोणों पर विचार करने के बाद, मैं एक समाधान के साथ आया हूं जो मैंने यहां सूचीबद्ध नहीं देखा था।

मेरे मानदंड थे:

  • सब कुछ स्रोत नियंत्रण में होना चाहिए। मैं चारों ओर झूठ बोल बिट्स पसंद नहीं है।
  • आदर्श रूप में, सेटिंग्स को एक फ़ाइल में रखें। मैं चीजों को भूल जाता हूँ अगर मैं उन पर सही नहीं लग रहा हूँ :)
  • कोई भी मैनुअल तैनात नहीं करता है। एक ही कपड़े कमांड के साथ परीक्षण / धक्का / तैनात करने में सक्षम होना चाहिए।
  • उत्पादन में विकास सेटिंग्स लीक करने से बचें।
  • यथासंभव "मानक" (* खांसी *) Django लेआउट के करीब रखें।

मैंने सोचा था कि मेजबान मशीन पर स्विच करने से कुछ समझ में आता है, लेकिन फिर पता चला कि यहां असली मुद्दा अलग-अलग वातावरणों के लिए अलग-अलग सेटिंग्स का है , और अहा पल था। मैंने इस कोड को अपनी सेटिंग के फ़ाइल के अंत में रखा है :

try:
    os.environ['DJANGO_DEVELOPMENT_SERVER'] # throws error if unset
    DEBUG = True
    TEMPLATE_DEBUG = True
    # This is naive but possible. Could also redeclare full app set to control ordering. 
    # Note that it requires a list rather than the generated tuple.
    INSTALLED_APPS.extend([
        'debug_toolbar',
        'django_nose',
    ])
    # Production database settings, alternate static/media paths, etc...
except KeyError: 
    print 'DJANGO_DEVELOPMENT_SERVER environment var not set; using production settings'

इस तरह, ऐप उत्पादन सेटिंग्स में चूक करता है, जिसका अर्थ है कि आप स्पष्ट रूप से अपने विकास के माहौल को "सफ़ेद" कर रहे हैं। यह बहुत ही सुरक्षित है कि पर्यावरण चर को स्थानीय रूप से सेट करना न भूलें, अगर यह दूसरा तरीका है और आप उत्पादन में कुछ सेट करना भूल जाते हैं और कुछ देव सेटिंग्स का उपयोग करने देते हैं।

स्थानीय रूप से विकसित होने पर, या तो शेल से या एक .bash_profile में या जहाँ भी:

$ export DJANGO_DEVELOPMENT_SERVER=yep

(या यदि आप विंडोज पर विकसित कर रहे हैं, तो नियंत्रण कक्ष या जो भी इन दिनों कहा जाता है, के माध्यम से सेट करें ... विंडोज ने हमेशा इसे इतना अस्पष्ट बना दिया है कि आप पर्यावरण चर सेट कर सकते हैं।)

इस दृष्टिकोण के साथ, देव सेटिंग्स सभी एक (मानक) जगह में हैं, और बस उन उत्पादन को ओवरराइड करते हैं जहां जरूरत होती है। उत्पादन सेटिंग्स पर कोई प्रभाव नहीं होने से स्रोत नियंत्रण के लिए विकास सेटिंग्स के साथ कोई भी मैकिंग पूरी तरह से सुरक्षित होना चाहिए।


बेहतर है कि बस अलग-अलग कॉन्फिग फाइलों को बनाए रखें, और डीजेंगो मानक env वेरिएबल का उपयोग करके चुनें DJANGO_SETTINGS_MODULE
Rob Grant
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.