आप सरल विकास और तैनाती के लिए Django को कैसे कॉन्फ़िगर करते हैं?


112

मैं Django विकास करते समय SQLite का उपयोग करता हूं , लेकिन एक लाइव सर्वर पर कुछ अधिक मजबूत अक्सर ( उदाहरण के लिए MySQL / PostgreSQL ) की आवश्यकता होती है। वास्तव में, Django सेटिंग्स में बदलाव करने के लिए अन्य परिवर्तन भी हैं: विभिन्न लॉगिंग स्थान / तीव्रता, मीडिया पथ, आदि।

आप तैनाती को सरल, स्वचालित प्रक्रिया बनाने के लिए इन सभी परिवर्तनों का प्रबंधन कैसे करते हैं?


मैं किसी और के रूप में कल्पना के रूप में कुछ भी नहीं कर रहा हूँ :)। मैं सिर्फ ORM कि django आपूर्ति का लाभ उठाता हूं।
एंड्रयू स्लेज

1
सवाल यह था कि वातावरण के बीच स्विच करने के लिए सेटिंग्स को बदलने को कैसे स्वचालित करें :-)
गुरुप्रसाद


आप इस पैकेज पर एक नजर डाल सकते हैं: django-split-settings
sobolevn

जवाबों:


86

अद्यतन: django-configurations जारी किया गया है जो संभवतः अधिकांश लोगों के लिए मैन्युअल रूप से करने से बेहतर विकल्प है।

यदि आप मैन्युअल रूप से काम करना पसंद करेंगे, तो मेरा पहले वाला उत्तर अभी भी लागू होता है:

मेरे पास कई सेटिंग्स फ़ाइलें हैं।

  • settings_local.py - होस्ट-विशिष्ट कॉन्फ़िगरेशन, जैसे डेटाबेस का नाम, फ़ाइल पथ, आदि।
  • settings_development.py- विकास के लिए उपयोग किए गए कॉन्फ़िगरेशन, जैसे DEBUG = True
  • settings_production.py- उत्पादन के लिए उपयोग किए गए कॉन्फ़िगरेशन, जैसे SERVER_EMAIL

मैं इन सभी को एक settings.pyफाइल के साथ जोड़ देता हूं जो पहले आयात करता है settings_local.py, और फिर अन्य दो में से एक। यह तय करता है कि कौन सी दो सेटिंग्स अंदर लोड करनी हैं settings_local.py- DEVELOPMENT_HOSTSऔर PRODUCTION_HOSTS। जिस मशीन पर यह चल रहा है, उसके होस्टनाम को खोजने के लिए settings.pyकॉल platform.node()करता है, और फिर सूचियों में उस होस्टनाम की तलाश करता है, और दूसरी सेटिंग फ़ाइल को लोड करता है जिसके आधार पर वह होस्टनाम को ढूंढता है।

इस तरह, केवल एक चीज जिसके बारे में आपको वास्तव में चिंता करने की ज़रूरत है वह है settings_local.pyफ़ाइल को होस्ट-विशिष्ट कॉन्फ़िगरेशन के साथ अद्यतित रखना , और बाकी सब कुछ स्वचालित रूप से सौंप दिया जाता है।

यहां एक उदाहरण देखें ।


2
क्या होगा अगर मंचन (विकास) और उत्पादन एक ही मशीन पर हो? platform.node () फिर वही देता है।
द्वारमाद्ज़े

2
उदाहरण लिंक नीचे है।
जिकसन

मेजबान सूचियों के आधार पर सेटियों को निर्धारित करने के लिए महान विचार! मेरा एक नाइटपिक नामकरण है (settings_local.py हमेशा आयात किया जाता है इसलिए किसी भी सेटिंग को ओवरराइड नहीं किया जाता है, फिर भी वास्तव में उत्पादन में सक्रिय रहेगा, प्रत्यय _localको भ्रमित करना) और तथ्य यह है कि आप मॉड्यूल का उपयोग नहीं कर रहे हैं (सेटिंग्स /base.py, settings / local.py, settings / production.py)। इसे अलग रिपॉजिटरी में रखना भी बुद्धिमानी होगी ... बेहतर अभी तक, एक सुरक्षित सेवा जो इस जानकारी को एक कैनोनिकल स्रोत (संभवतः अधिकांश के लिए ओवरकिल) से कार्य करती है ... ताकि नए होस्ट को एक नई रिलीज़ की आवश्यकता न हो।
डायलनयुंग

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

26

व्यक्तिगत रूप से, मैं इस परियोजना के लिए एक एकल सेटिंग्स का उपयोग करता हूं, मुझे अभी यह होस्टनाम दिख रहा है जो मेरे पास है (मेरी विकास मशीनों में होस्टनाम हैं जो "गेब्रिएल" से शुरू होते हैं इसलिए मेरे पास बस यही है:

import socket
if socket.gethostname().startswith('gabriel'):
    LIVEHOST = False
else: 
    LIVEHOST = True

फिर अन्य भागों में मेरे पास कुछ चीजें हैं जैसे:

if LIVEHOST:
    DEBUG = False
    PREPEND_WWW = True
    MEDIA_URL = 'http://static1.grsites.com/'
else:
    DEBUG = True
    PREPEND_WWW = False
    MEDIA_URL = 'http://localhost:8000/static/'

और इसी तरह। थोड़ा कम पठनीय, लेकिन यह ठीक काम करता है और कई सेटिंग्स फ़ाइलों को हथकंडा करने के लिए बचाता है।


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

24

सेटिंग्स के अंत में, मेरे पास निम्नलिखित हैं:

try:
    from settings_local import *
except ImportError:
    pass

इस तरह अगर मैं डिफ़ॉल्ट सेटिंग्स को ओवरराइड करना चाहता हूं, तो मुझे सेटिंग्स के बगल में बस settings_local.py डालनी होगी।


4
यह थोड़ा खतरनाक है क्योंकि अगर टाइपो में settings_localपरिणाम होता है ImportError, तो यह exceptइसे चुपचाप निगल जाएगा।
क्रिस मार्टिन

आप संदेश No module named...बनाम की जाँच कर सकते हैं cannot import name..., लेकिन यह भंगुर है। या, अपने आयात को सेटिंग ब्लॉकों में settings_local.py में रखें और अधिक विशिष्ट अपवाद उठाएँ: MisconfiguredSettingsया उस प्रभाव के लिए कुछ।
डायलनयुंग

11

मेरे पास दो फाइलें हैं। settings_base.pyजिसमें सामान्य / डिफ़ॉल्ट सेटिंग्स होती हैं, और जिसे स्रोत नियंत्रण में जांचा जाता है। प्रत्येक परिनियोजन में एक अलग है settings.py, जो from settings_base import *शुरुआत में निष्पादित होता है और फिर आवश्यकतानुसार समाप्त हो जाता है।


1
मैं भी इस का उपयोग करें। यह व्युत्क्रम (dmishe के "settings_local आयात *" से सेटिंग्स के अंत में बेहतर है) क्योंकि यह स्थानीय सेटिंग्स को एक्सेस करने और वैश्विक लोगों को संशोधित करने की अनुमति देता है यदि आवश्यक हो।
कार्ल मेयर

3
यदि settings_local.pyऐसा होता है from settings import *, तो यह मानों को ओवरराइड कर सकता है settings.py। ( settings_local.pyफ़ाइल को अंत में आयात किया जाना है settings.py)।
सेठ

वैसे भी किया जा सकता है। इसके बाद के संस्करण stackoverflow.com/a/7047633/3124256 पर एक नज़र डालें । @ सेठ कि एक परिपत्र आयात के लिए एक नुस्खा है।
डायलनयुंग

7

सबसे सरल तरीका मैंने पाया:

1) डिफ़ॉल्ट का उपयोग settings.py एक बनाने के स्थानीय विकास और 2) production-settings.py के साथ शुरू:

import os
from settings import *

और फिर उत्पादन में भिन्न सेटिंग्स को ओवरराइड करें:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}

उत्पादन-सेटिंग को लोड करने के लिए django कैसे जानता है?
AlxVallejo

2

कुछ हद तक कई डेटाबेस के साथ Django की तैनाती के मुद्दे के लिए, आप Djangostack पर एक नज़र रखना चाहते हैं । आप एक पूरी तरह से नि: शुल्क इंस्टॉलर डाउनलोड कर सकते हैं जो आपको अपाचे, पायथन, Django, आदि को स्थापित करने की अनुमति देता है। स्थापना प्रक्रिया के भाग के रूप में हम आपको यह चुनने की अनुमति देते हैं कि आप किस डेटाबेस का उपयोग करना चाहते हैं (MySQL, SQLite, PostgreSQL)। आंतरिक रूप से तैनाती को स्वचालित करते समय हम बड़े पैमाने पर इंस्टॉलर का उपयोग करते हैं (उन्हें अनअटेंडेड मोड में चलाया जा सकता है)।


1
वैकल्पिक रूप से मैं Django टर्नकी लिनक्स की सिफारिश करना चाहूंगा जो कि django के साथ एक Ubuntu * NIX स्टैक पर आधारित है।
जोश अगम

1

मेरे पास एक बाहरी निर्देशिका में मेरी सेटिंग्स फ़ाइल है। इस तरह, यह स्रोत नियंत्रण में जाँच नहीं करता है, या एक तैनाती द्वारा लिखा गया है। मैंने इसे अपने Django प्रोजेक्ट के तहत सेटिंग्सफ्रीडम फ़ाइल में, किसी भी डिफ़ॉल्ट सेटिंग्स के साथ डाला:

import sys
import os.path

def _load_settings(path):    
    print "Loading configuration from %s" % (path)
    if os.path.exists(path):
    settings = {}
    # execfile can't modify globals directly, so we will load them manually
    execfile(path, globals(), settings)
    for setting in settings:
        globals()[setting] = settings[setting]

_load_settings("/usr/local/conf/local_settings.py")

ध्यान दें: यह बहुत खतरनाक है यदि आप स्थानीय_सेटिंग्सहोमो पर भरोसा नहीं कर सकते।


1

जिम द्वारा बताई गई कई सेटिंग्स फ़ाइलों के अलावा, मैं अपनी सेटिंग्स में दो सेटिंग्स को फ़ाइल करने के लिए सबसे ऊपर हूँ BASE_DIRऔर BASE_URLसाइट के आधार पर कोड और URL के पथ पर सेट हो, अन्य सभी सेटिंग्स संशोधित हैं अपने आप को इन करने के लिए।

BASE_DIR = "/home/sean/myapp/" जैसे MEDIA_ROOT = "%smedia/" % BASEDIR

इसलिए परियोजना को आगे बढ़ाते समय मुझे केवल इन सेटिंग्स को संपादित करना है और पूरी फ़ाइल को नहीं खोजना है।

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


Ansible अजगर है और फैब्रिक की तुलना में अधिक मजबूत प्रावधान सुविधाएं प्रदान करता है। वे अच्छी तरह से जोड़ी।
डायलनयुंग

1

खैर, मैं इस विन्यास का उपयोग करता हूं:

सेटिंग्स के अंत में:

#settings.py
try:
    from locale_settings import *
except ImportError:
    pass

और locale_settings.py में:

#locale_settings.py
class Settings(object):

    def __init__(self):
        import settings
        self.settings = settings

    def __getattr__(self, name):
        return getattr(self.settings, name)

settings = Settings()

INSTALLED_APPS = settings.INSTALLED_APPS + (
    'gunicorn',)

# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings

1

इतने सारे जटिल जवाब!

हर सेटिंग्स फ़ाइल के साथ आता है:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

मैं उस निर्देशिका का उपयोग इस तरह के DEBUG चर को सेट करने के लिए करता हूं (निर्देशन के साथ फिर से शुरू करें जहां आपका देव कोड है):

DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
    DEBUG = True

फिर, हर बार जब सेटिंग्स फ़ाइल को स्थानांतरित किया जाता है, तो DEBUG गलत हो जाएगा और यह आपके उत्पादन वातावरण है।

हर बार जब आप अपने देव वातावरण में लोगों की तुलना में अलग-अलग सेटिंग्स की आवश्यकता होती है, तो बस उपयोग करें:

if(DEBUG):
    #Debug setting
else:
    #Release setting

0

मुझे लगता है कि यह साइट के आकार पर निर्भर करता है कि क्या आपको SQLite का उपयोग करने से आगे बढ़ने की आवश्यकता है, मैंने कई छोटे लाइव साइटों पर सफलतापूर्वक SQLite का उपयोग किया है और यह बहुत अच्छा चलता है।


0

मैं पर्यावरण का उपयोग करता हूं:

if os.environ.get('WEB_MODE', None) == 'production' :
   from settings_production import *
else :
   from settings_dev import *

मेरा मानना ​​है कि यह बहुत बेहतर दृष्टिकोण है, क्योंकि अंततः आपको अपने परीक्षण वातावरण के लिए विशेष सेटिंग्स की आवश्यकता होती है, और आप इसे आसानी से इस स्थिति में जोड़ सकते हैं।


0

यह एक पुरानी पोस्ट है, लेकिन मुझे लगता है कि अगर मैं इस उपयोगी को जोड़ दूं तो libraryयह चीजों को सरल बना देगा।

Django-कॉन्फ़िगरेशन का उपयोग करें

जल्दी शुरू

pip install django-configurations

फिर शामिल विन्यास को शामिल करें। अपने प्रोजेक्ट की सेटिंग्स में कोनफिगरेशन क्लास या सेटिंग्स को स्टोर करने के लिए आपके द्वारा उपयोग किए जा रहे किसी अन्य मॉड्यूल जैसे:

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

DJANGO_CONFIGURATIONपर्यावरण चर को आपके द्वारा बनाए गए वर्ग के नाम पर सेट करें , जैसे ~/.bashrc:

export DJANGO_CONFIGURATION=Dev

और DJANGO_SETTINGS_MODULEपर्यावरण चर के लिए मॉड्यूल आयात पथ हमेशा की तरह, जैसे कि बैश में:

export DJANGO_SETTINGS_MODULE=mysite.settings

--configurationDjango के डिफ़ॉल्ट --settingsकमांड लाइन विकल्प की तर्ज पर Django प्रबंधन कमांड का उपयोग करते समय वैकल्पिक रूप से विकल्प की आपूर्ति करें , जैसे:

python manage.py runserver --settings=mysite.settings --configuration=Dev

आपके विन्यास का उपयोग करने के लिए Django सक्षम करने के लिए अब आप अपने को संशोधित करना manage.py या wsgi.py उचित स्टार्टर काम करता है, उदाहरण के लिए एक विशिष्ट की Django-विन्यास 'संस्करण का उपयोग करें स्क्रिप्ट manage.py Django-विन्यास का उपयोग कर इस प्रकार दिखाई देगा:

#!/usr/bin/env python

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
    os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

    from configurations.management import execute_from_command_line

    execute_from_command_line(sys.argv)

10 लाइन में सूचना हम आम उपकरण का उपयोग नहीं करते हैं, django.core.management.execute_from_command_lineलेकिन इसके बजाय configurations.management.execute_from_command_line

वही आपकी wsgi.py फ़ाइल पर लागू होता है , जैसे:

import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev')

from configurations.wsgi import get_wsgi_application

application = get_wsgi_application()

यहां हम डिफ़ॉल्ट django.core.wsgi.get_wsgi_applicationफ़ंक्शन का उपयोग नहीं करते हैं, बल्कि इसके बजाय configurations.wsgi.get_wsgi_application

बस! अब आप के साथ अपनी परियोजना का उपयोग कर सकते manage.py और अपने पसंदीदा WSGI सक्षम सर्वर।


-2

वास्तव में आपको संभवतः अपने विकास और उत्पादन के वातावरण के लिए समान (या लगभग समान) कॉन्फ़िगर करने पर विचार करना चाहिए। अन्यथा, "अरे, यह मेरी मशीन पर काम करता है" जैसी परिस्थितियां समय-समय पर होंगी।

तो अपनी तैनाती को स्वचालित करने और उन WOMM मुद्दों को खत्म करने के लिए, बस डॉकर का उपयोग करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.