Django: विकास और उत्पादन सेटिंग्स का प्रबंधन कैसे करें?


129

मैं एक बुनियादी ऐप विकसित कर रहा हूं। अब परिनियोजन चरण में यह स्पष्ट हो गया है कि मुझे स्थानीय सेटिंग्स और उत्पादन सेटिंग्स दोनों की आवश्यकता है।

निम्नलिखित जानना बहुत अच्छा होगा:

  • विकास और उत्पादन सेटिंग्स से निपटने के लिए सबसे अच्छा कैसे।
  • केवल django-debug-toolbar जैसे ऐप्स को विकास के माहौल में कैसे रखें।
  • किसी भी अन्य युक्तियों और विकास और तैनाती सेटिंग्स के लिए सर्वोत्तम अभ्यास।

यहाँ देखें: stackoverflow.com/questions/88259/… और यहाँ code.djangoproject.com/wiki/SplitSettings
alan

जवाबों:


109

DJANGO_SETTINGS_MODULEवातावरण चर नियंत्रण जो सेटिंग्स फ़ाइल Django लोड होगा।

इसलिए आप अपने संबंधित वातावरणों के लिए अलग कॉन्फ़िगरेशन फ़ाइल बनाते हैं (ध्यान दें कि वे दोनों import *एक अलग, "साझा सेटिंग्स" फ़ाइल से कर सकते हैं), और DJANGO_SETTINGS_MODULEजो नियंत्रित करने के लिए उपयोग करें।

ऐसे:

जैसा कि Django प्रलेखन में नोट किया गया है:

DJANGO_SETTINGS_MODULE का मान पाइथन पथ सिंटैक्स में होना चाहिए, जैसे mysite.etettings। ध्यान दें कि सेटिंग मॉड्यूल पायथन आयात खोज पथ पर होना चाहिए।

तो, चलिए आपके द्वारा बनाए गए myapp/production_settings.pyऔर myapp/test_settings.pyआपके स्रोत भंडार में मान लेते हैं ।

उस स्थिति में, आप क्रमशः DJANGO_SETTINGS_MODULE=myapp.production_settingsपूर्व DJANGO_SETTINGS_MODULE=myapp.test_settingsका उपयोग करने और बाद का उपयोग करने के लिए सेट होंगे ।


यहां से DJANGO_SETTINGS_MODULEपर्यावरण चर को स्थापित करने के लिए समस्या उबलती है ।

DJANGO_SETTINGS_MODULEस्क्रिप्ट या शेल का उपयोग करके सेट करना

फिर आप सही सेटिंग्स को लोड करने के लिए बूटस्ट्रैप स्क्रिप्ट या प्रक्रिया प्रबंधक का उपयोग कर सकते हैं (पर्यावरण को सेट करके), या सिर्फ Django शुरू करने से पहले इसे अपने शेल से चलाएं export DJANGO_SETTINGS_MODULE=myapp.production_settings:।

ध्यान दें कि आप इस निर्यात को शेल से किसी भी समय चला सकते हैं - इसे आपके .bashrcया किसी भी चीज़ में रहने की आवश्यकता नहीं है ।

DJANGO_SETTINGS_MODULEप्रोसेस मैनेजर का उपयोग करके सेटिंग करना

यदि आप बूटस्ट्रैप स्क्रिप्ट लिखने के शौकीन नहीं हैं, जो पर्यावरण को सेट करता है (और ऐसा महसूस करने के बहुत अच्छे कारण हैं!), तो मैं एक प्रक्रिया प्रबंधक का उपयोग करने की सलाह दूंगा:


अंत में, ध्यान दें कि आप पूरी तरह से अलग स्थान पर सेटिंग्स को स्टोर करने के लिए चर का लाभ उठा सकते हैं PYTHONPATH(जैसे उत्पादन सर्वर पर, उन्हें संग्रहीत करना /etc/)। यह एप्लिकेशन फ़ाइलों से कॉन्फ़िगरेशन को अलग करने की अनुमति देता है। आप चाहें या न चाहें, यह इस बात पर निर्भर करता है कि आपका ऐप कैसे संरचित है।


7
स्पष्ट करने के लिए, चूंकि settings.pyफ़ाइल SiteName/settings.pyडिफ़ॉल्ट रूप से संग्रहीत की जाती है , यदि आप अपनी वैकल्पिक सेटिंग्स फ़ाइलों को उसी निर्देशिका में रखते हैं, जो लाइन को बिन में जोड़ा गया / सक्रिय किया जाना चाहिए DJANGO_SETTINGS_MODULE="SiteName.test_settings"अन्यथा उत्कृष्ट उत्तर पढ़ना चाहिए !
अलेक्सांद्रि

2
संयोग से क्या आप इस बारे में एक ट्यूटोरियल जानते हैं कि इस कदम को कैसे किया जाए, मैं Django के लिए नया हूं और यह नहीं जानता कि
DJANGO_SETTINGS_MODULE

यह समाधान एक कोंडा एनवी के लिए सही नहीं लगता है। एक कोंडा एनवी में कोई बिन / सक्रिय नहीं है।
पूय यूसेफ़ी

1
@PouyaYousefi: आपको इस उत्तर का उपयोग करने के लिए virtualenv का उपयोग करने की आवश्यकता नहीं है । जवाब वास्तव में दो चरणों में उबलता है: ए) अलग-अलग सेटिंग्स फ़ाइलों और बी) का उपयोग DJANGO_SETTINGS_MODULEकरें जिसे आप उपयोग करना चाहते हैं। संशोधित करना bin/activate बाद में करने के लिए एक है (टीबीएच, मुझे नहीं लगता कि यह वैसे भी एक अच्छा विचार है, इसलिए मैंने इसे निकाल लिया), लेकिन यह एकमात्र नहीं है।
थॉमस ओरोज़ो

यह उपयोगी भी है यदि आप pycharm समुदाय संस्करण में Django का उपयोग कर रहे हैं और आपको कमांड लाइन और pycharm दोनों पर यूनिट परीक्षण सही ढंग से चलाने की आवश्यकता है। मान लें कि आपने अपने स्रोत रिपॉजिटरी में myapp / settings.py में केवल एक सरल कॉन्फिग फ़ाइल बनाई है। उस स्थिति में, आप परीक्षण मामलों को चलाने के लिए बाद में उपयोग करने के लिए मेनू RUN / एडिट कॉन्फ़िगरेशन / एनवायरमेंट वैरिएबल में "DJANGO_SETTINGS_MODULE = myapp.settings" सेट करेंगे।
F.Tamy

58

डिफ़ॉल्ट रूप से उत्पादन सेटिंग्स का उपयोग करें, लेकिन settings_dev.pyआपकी settings.pyफ़ाइल के समान फ़ोल्डर में नामक एक फ़ाइल बनाएं । ओवरराइड्स को वहां जोड़ें, जैसे कि DEBUG=True

विकास के लिए उपयोग किए जाने वाले कंप्यूटर पर, इसे अपनी ~/.bashrcफ़ाइल में जोड़ें :

export DJANGO_DEVELOPMENT=true

अपनी settings.pyफ़ाइल के निचले भाग में , निम्न जोड़ें।

# Override production variables if DJANGO_DEVELOPMENT env variable is set
if os.environ.get('DJANGO_DEVELOPMENT'):
    from settings_dev import *  # or specific overrides

(ध्यान दें कि आयात कर रहा है * आमतौर पर पायथन में से बचना चाहिए)

डिफ़ॉल्ट रूप से उत्पादन सर्वर कुछ भी ओवरराइड नहीं करेगा। किया हुआ!

अन्य उत्तरों की तुलना में, यह एक सरल है क्योंकि इसे अपडेट करने PYTHONPATHया सेट करने की आवश्यकता नहीं होती है , DJANGO_SETTINGS_MODULEजो आपको केवल एक समय में एक django प्रोजेक्ट पर काम करने की अनुमति देता है।


8
यह कैसे सही जवाब नहीं है? एसओ वास्तव में आजकल एक गड़बड़ है। Ty cs01
codyc4321

if os.environ.get('DJANGO_DEVELOPMENT', 'true')भी काम करता है। मैंने इसका उल्लेख केवल इसलिए किया क्योंकि उपरोक्त is not trueविधि मेरे लिए पायथन 3.6 पर आयात करने में विफल रही।
बर्ट

1
@brt यह एक बुरा विचार है: यह हमेशा आपकी DEVसेटिंग्स का उपयोग करेगा जो एक सार्वजनिक सर्वर पर निजी डेटा लीक करेगा। आप वास्तव में यह जांचना चाहते हैं कि DJANGO_DEVELOPMENTपर्यावरण चर मौजूद है (यानी is not None)।
सीएस ०१

जानकारी के लिए धन्यवाद, @ cs01। मुझे एहसास हुआ कि मैंने कुछ गलत किया जब मैंने अपनी साइट को गलत सेटिंग्स लोडिंग के साथ उड़ा दिया, लेकिन मुझे यकीन नहीं settings_dev.pyथा कि सर्वर पर लोड क्यों किया गया था।
बर्ट

2
@ सीएस 01 मैं यह सुनिश्चित करने के लिए इतनी दूर तक जाऊंगा कि यह मौजूद है और यह सत्य है, बस is not Noneचेक को छोड़ने से । इसके अलावा os.getenvआशुलिपि है
तजोरीमेरी

35

मेरे पास आमतौर पर प्रति वातावरण में एक सेटिंग फ़ाइल और एक साझा सेटिंग्स फ़ाइल होती है:

/myproject/
  settings.production.py
  settings.development.py
  shared_settings.py

मेरी हर पर्यावरण फाइल में है:

try:
    from shared_settings import *
except ImportError:
    pass

इससे यदि आवश्यक हो (उस श्लोक के नीचे संशोधनों को जोड़कर) मुझे साझा सेटिंग्स को ओवरराइड करने की अनुमति मिलती है।

मैं तब चुनता हूं कि कौन सी सेटिंग्स फाइल को सेटिंग्स से लिंक करके उपयोग करना है:

ln -s settings.development.py settings.py

2
आप pep8 के निषेध से कैसे निपटते हैं import *? क्या आप उस चेक को अक्षम करते हैं? मैंने इस आयात को एक समय में लपेट लिया है, exec()लेकिन मेरे पास इस फ़ाइल में परिभाषित नहीं किए गए चर पर सशर्त नहीं हो सकते हैं, और न ही मैं INSTALLED_APPSचर को बदल सकता हूं क्योंकि यह "अपरिभाषित" है
मिखाइल

11
हम अपनी सेटिंग्स फ़ाइलों को नहीं देते हैं, क्योंकि वे वास्तव में इतना कोड नहीं हैं जितना कि वे पायथन में व्यक्त कॉन्फ़िगरेशन हैं।
डैनियल वाटकिंस

17

मैं इसे 6 आसान चरणों में करता हूं:

  1. अपने प्रोजेक्ट डायरेक्टरी के अंदर एक फोल्डर बनाएं और उसे नाम दें settings

    परियोजना संरचना:

    myproject/
           myapp1/
           myapp2/              
           myproject/
                  settings/
  2. के अंदर चार अजगर फ़ाइलें बनाएं settingsनिर्देशिका अर्थात् __init__.py, base.py, dev.pyऔरprod.py

    सेटिंग्स फ़ाइलें:

    settings/
         __init__.py
         base.py
         prod.py
         dev.py 
  3. __init__.pyइसे निम्न सामग्री से खोलें और भरें:

    init .py:

    from .base import *
    # you need to set "myproject = 'prod'" as an environment variable
    # in your OS (on which your website is hosted)
    if os.environ['myproject'] == 'prod':
       from .prod import *
    else:
       from .dev import *
  4. base.pyउदाहरण के लिए इसे सभी सामान्य सेटिंग्स से खोलें और भरें (जिसका उपयोग उत्पादन और विकास दोनों में किया जाएगा):

    base.py:

    import os
    ...
    INSTALLED_APPS = [...]
    MIDDLEWARE = [...]
    TEMPLATES = [{...}]
    ...
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    MEDIA_ROOT = os.path.join(BASE_DIR, '/path/')
    MEDIA_URL = '/path/'
  5. dev.pyउस सामग्री को खोलें और उसमें शामिल करें जो उदाहरण के लिए विकास विशिष्ट है:

    dev.py:

    DEBUG = True
    ALLOWED_HOSTS = ['localhost']
    ...
  6. prod.pyउस सामग्री को खोलें और उसमें शामिल करें जो उदाहरण के लिए उत्पादन विशिष्ट है:

    prod.py:

    DEBUG = False
    ALLOWED_HOSTS = ['www.example.com']
    LOGGING = [...]
    ...

10

कई settings*.pyफ़ाइलों को बनाएं , जो चर को प्रति वातावरण में बदलने की आवश्यकता है। फिर अपनी मास्टर settings.pyफाइल के अंत में :

try:
  from settings_dev import *
except ImportError:
  pass

आप settings_*प्रत्येक चरण के लिए अलग-अलग फाइलें रखते हैं।

अपनी settings_dev.pyफ़ाइल के शीर्ष पर , इसे जोड़ें:

import sys
globals().update(vars(sys.modules['settings']))

उन चर आयात करने के लिए जिन्हें आपको संशोधित करने की आवश्यकता है।

इस विकी प्रविष्टि में आपकी सेटिंग्स को विभाजित करने के तरीके के बारे में अधिक विचार हैं।


धन्यवाद बुरहम! एप्लिकेशन को परिनियोजित करने के दौरान, मुझे कार्रवाई में अपनी तैनाती सेटिंग देखने के लिए settings_dev फ़ाइल को निकालने की आवश्यकता होगी?
क्रिस्टियन

हाँ, या के साथ आयात की जगहsettings_prod.py
बुरहान खालिद

1
परिनियोजन पर मास्टर सेटिंग्स को संपादित करने का अर्थ है कि यह संस्करण नियंत्रण के साथ टकराएगा, हालांकि, यह जरूरी नहीं है कि आगे का सबसे अच्छा तरीका है। मैं कहता हूँ कि थॉमस ओरोज़्को का विकल्प सबसे अच्छा है - आप अपने virtualenv में स्क्रिप्ट या अपने gunicorn या mod_wsgi सेटअप में DJANGO_SETTINGS_MODULE सेट कर सकते हैं
स्टीव

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

यदि आप virtualenv का उपयोग कर रहे हैं, तो यह आमतौर पर {{project_name}} के लिए डिफ़ॉल्ट होगा। इसलिए 'सेटिंग' sys.modules में एक कुंजी नहीं होगी। यह 'myproject.settings' (या जो भी आपके प्रोजेक्ट का नाम है) होगा। आप modname = "%s.settings" % ".".join(__name__.split('.')[:-1])पूर्ण मॉड्यूल नाम और फिर प्राप्त करने के लिए उपयोग कर सकते हैं globals().update(vars(sys.modules[modname]))। मुझे लगता है कि मेरे लिए अच्छी तरह से काम करता है। निश्चित रूप से एक स्ट्रिंग के पक्ष में मॉड्यूल के नाम को निर्धारित करने के बारे में बिट फॉरवर्ड करना शायद ज्यादातर मामलों में भी काम करेगा।
एरिक

9

मैं भयानक django- कॉन्फ़िगरेशन का उपयोग करता हूं , और सभी सेटिंग्स मेरे में संग्रहीत हैं settings.py:

from configurations import Configuration

class Base(Configuration):
    # all the base settings here...
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    ...

class Develop(Base):
    # development settings here...
    DEBUG = True 
    ...

class Production(Base):
    # production settings here...
    DEBUG = False

Django परियोजना को कॉन्फ़िगर करने के लिए मैंने केवल डॉक्स का अनुसरण किया ।


7

यहां वह दृष्टिकोण है जिसका हम उपयोग करते हैं:

  • settingsपठनीयता के लिए कई फाइलों में सेटिंग्स को विभाजित करने के लिए मॉड्यूल;
  • .env.jsonक्रेडेंशियल्स और मापदंडों को संग्रहीत करने के लिए फ़ाइल जिसे हम अपने गिट रिपॉजिटरी से बाहर करना चाहते हैं, या जो पर्यावरण विशिष्ट हैं;
  • एक env.pyफ़ाइल को पढ़ने के लिए .env.jsonफ़ाइल

निम्नलिखित संरचना को ध्यान में रखते हुए:

...
.env.json           # the file containing all specific credentials and parameters
.gitignore          # the .gitignore file to exclude `.env.json`
project_name/       # project dir (the one which django-admin.py creates)
  accounts/         # project's apps
    __init__.py
    ...
  ...
  env.py            # the file to load credentials
  settings/
    __init__.py     # main settings file
    database.py     # database conf
    storage.py      # storage conf
    ...
venv                # virtualenv
...

साथ .env.jsonकी तरह:

{
    "debug": false,
    "allowed_hosts": ["mydomain.com"],
    "django_secret_key": "my_very_long_secret_key",
    "db_password": "my_db_password",
    "db_name": "my_db_name",
    "db_user": "my_db_user",
    "db_host": "my_db_host",
}

और project_name/env.py:

<!-- language: lang-python -->
import json
import os


def get_credentials():
    env_file_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    with open(os.path.join(env_file_dir, '.env.json'), 'r') as f:
        creds = json.loads(f.read())
    return creds


credentials = get_credentials()

हम निम्नलिखित सेटिंग्स हो सकते हैं:

<!-- language: lang-py -->
# project_name/settings/__init__.py
from project_name.env import credentials
from project_name.settings.database import *
from project_name.settings.storage import *
...

SECRET_KEY = credentials.get('django_secret_key')

DEBUG = credentials.get('debug')

ALLOWED_HOSTS = credentials.get('allowed_hosts', [])

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    ...
]

if DEBUG:
    INSTALLED_APPS += ['debug_toolbar']

...

# project_name/settings/database.py
from project_name.env import credentials

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': credentials.get('db_name', ''),
        'USER': credentials.get('db_user', ''),
        'HOST': credentials.get('db_host', ''),
        'PASSWORD': credentials.get('db_password', ''),
        'PORT': '5432',
    }
}

इस समाधान के लाभ हैं:

  • उपयोगकर्ता विशिष्ट क्रेडेंशियल्स और कॉन्फ़िगरेशनगिट रिपॉजिटरी को संशोधित किए बिना स्थानीय विकास के लिए ;
  • पर्यावरण विशिष्ट विन्यास , उदाहरण के लिए आपके पास तीन अलग-अलग वातावरण हो सकते हैं जैसे तीन अलग-अलग .env.jsonदेव, स्टैगिंग और उत्पादन;
  • क्रेडेंशियल्स रिपॉजिटरी में नहीं हैं

मुझे आशा है कि यह मदद करता है, बस मुझे यह बताएं कि क्या आपको इस समाधान के साथ कोई चेतावनी दिखाई देती है।


यह मानते हुए कि कहां envसे बदलना है dev, prodआदि? पुरानी settings.pyफ़ाइल में क्या जाता है ? में क्या है storage.pyऔर database.py?
dbinott

हाय @dbinott, आप आसानी से अद्यतन कर सकते हैं env.pyफ़ाइल ताकि आपके चयन कर सकते हैं, एक वातावरण चर, जो फ़ाइल लोड करने के लिए साथ
Charlesthk

उदाहरण के लिए: conf = os.environ.get ( 'CONF', '') file_ = च "। .Env {conf} .json"
Charlesthk

आप एक देशी अजगर डेटटाइप के विरोध में क्यों मजाक करेंगे?
हवाई

4

मैं फाइलिंग संरचना का उपयोग करता हूं:

project/
   ...
   settings/
   settings/common.py
   settings/local.py
   settings/prod.py
   settings/__init__.py -> local.py

तो __init__.pyएक लिंक है (विंडोज़ में यूनिक्स या mklink में ln) local.pyया ऐसा हो सकता है prod.pyकि कॉन्फ़िगरेशन अभी भी project.settingsमॉड्यूल में साफ और व्यवस्थित है, और यदि आप किसी विशेष कॉन्फ़िगरेशन का उपयोग करना चाहते हैं, तो आप पर्यावरण चर DJANGO_SETTINGS_MODULEका उपयोग कर सकते हैंproject.settings.prod यदि आपको ज़रूरत है उत्पादन पर्यावरण के लिए एक कमांड चलाने के लिए।

फाइलों में prod.pyऔर local.py:

from .shared import *

DATABASE = {
    ...
}

और shared.pyफ़ाइल विशिष्ट कॉन्फ़िगरेशन के बिना वैश्विक के रूप में रहती है।


3

CS01 के उत्तर का निर्माण:

यदि आपको पर्यावरण चर की समस्या हो रही है, तो इसके मान को एक स्ट्रिंग पर सेट करें (जैसे मैंने किया DJANGO_DEVELOPMENT="true" )।

मैंने cs01 की फाइल वर्कफ़्लो को भी इस प्रकार बदला:

#settings.py
import os
if os.environ.get('DJANGO_DEVELOPMENT') is not None:
    from settings_dev import * 
else:
    from settings_production import *
#settings_dev.py
development settings go here
#settings_production.py
production settings go here

इस तरह, Django को उपयुक्त सेटिंग्स फ़ाइल को चलाने से पहले सेटिंग्स फ़ाइल की संपूर्णता के माध्यम से पढ़ना नहीं पड़ता है। यह समाधान काम में आता है यदि आपकी उत्पादन फ़ाइल को केवल आपके उत्पादन सर्वर पर सामान की आवश्यकता होती है।

नोट: पायथन 3 में, आयातित फ़ाइलों को एक .संलग्न (जैसे from .settings_dev import *) की आवश्यकता है


1

यदि आप 1 सेटिंग फ़ाइल रखना चाहते हैं, और आपका विकास ऑपरेटिंग सिस्टम आपके उत्पादन ऑपरेटिंग सिस्टम से अलग है, तो आप इसे अपनी सेटिंग्स के नीचे रख सकते हैं:

from sys import platform
if platform == "linux" or platform == "linux2":
    # linux
    # some special setting here for when I'm on my prod server
elif platform == "darwin":
    # OS X
    # some special setting here for when I'm developing on my mac
elif platform == "win32":
    # Windows...
    # some special setting here for when I'm developing on my pc

और पढ़ें: मैं पायथन में ऑपरेटिंग सिस्टम की जांच कैसे करूं?


1

ऐसा लगता है कि इसका उत्तर दिया गया है, हालांकि एक विधि जिसका उपयोग मैं संस्करण नियंत्रण के साथ करता हूं वह निम्नलिखित है:

मेरे स्थानीय विकास के वातावरण में सेटिंग्स के रूप में उसी निर्देशिका में एक एनवीएफ़डीओ फ़ाइल सेट करें जिसे मैं .ignignore में भी जोड़ता हूं:

env.py:

#!usr/bin/python

DJANGO_ENV = True
ALLOWED_HOSTS = ['127.0.0.1', 'dev.mywebsite.com']

.gitignore:

mywebsite/env.py

settings.py:

if os.path.exists(os.getcwd() + '/env.py'):
    #env.py is excluded using the .gitignore file - when moving to production we can automatically set debug mode to off:
    from env import *
else:
    DJANGO_ENV = False

DEBUG = DJANGO_ENV

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


सबसे सरल उपाय। एक Configवर्ग env.pyफ़ाइल के अंदर सब कुछ भी परिभाषित कर सकता है । फिर एक के बजाय import *, मॉड्यूल द्वारा आयात किया जा सकता है from env import Config। इस तरह आपको यह भी उपयोग करने की आवश्यकता नहीं है कि अगर os.pathजाँच करें जो इस पूरी चीज़ को बहुत सरल बनाता है।
सिद्धार्थ पंत

0

settings.pyउत्पादन के लिए उपयोग करें । एक ही निर्देशिका में settings_dev.pyओवरराइड के लिए बनाएँ ।

# settings_dev.py

from .settings import * 

DEBUG = False

एक देव मशीन पर अपना Django ऐप चलाएं:

DJANGO_SETTINGS_MODULE=<your_app_name>.settings_dev python3 manage.py runserver

एक ठेस मशीन पर चलाने के रूप में यदि आप सिर्फ settings.pyऔर कुछ नहीं था।

लाभ

  1. settings.py (उत्पादन के लिए उपयोग किया जाता है) इस तथ्य से पूरी तरह से अज्ञेय है कि कोई अन्य वातावरण भी मौजूद है।
  2. ठेस और देव के बीच अंतर देखने के लिए आप बस एक ही स्थान पर नज़र डालें - settings_dev.py। भर में बिखरे विन्यास को इकट्ठा करने की आवश्यकता नहीं है settings_prod.py, settings_dev.pyऔर settings_shared.py
  3. यदि कोई उत्पादन समस्या का निवारण करने के बाद आपके ठेस विन्यास में सेटिंग जोड़ता है तो आप निश्चिंत हो सकते हैं कि यह आपके देव विन्यास में भी प्रकट होगा (जब तक कि स्पष्ट रूप से ओवरराइड नहीं किया जाता है)। इस प्रकार विभिन्न कॉन्फिग फाइलों के बीच विचलन को कम से कम किया जाएगा।

0

फ़ाइलों को सेट करने की समस्या के लिए, मैं प्रतिलिपि बनाना चुनता हूं

Project
   |---__init__.py   [ write code to copy setting file from subdir to current dir]
   |---settings.py  (do not commit this file to git)
   |---setting1_dir
   |         |--  settings.py
   |---setting2_dir
   |         |--  settings.py

जब आप django चलाते हैं, __init__py चला जाएगा। इस समय, settings.py in setting1_dirकी जगह लेगा settings.py in Project

विभिन्न एनव को कैसे चुनें?

  • __init__.pyसीधे संशोधित करें।
  • संशोधित करने के लिए एक bash फ़ाइल बनाएँ __init__.py
  • लिनक्स में env को संशोधित करें, और फिर __init__.pyइस चर को पढ़ें।

इस तरह से क्यों उपयोग करें?

क्योंकि मुझे एक ही डायरेक्टरी में इतनी सारी फाइलें पसंद नहीं हैं, बहुत सी फाइलें दूसरे पार्टनर्स को भ्रमित करेंगी और IDE के लिए बहुत अच्छी तरह से नहीं होंगी (IDE को पता नहीं चल सकता है कि हम किस फाइल का इस्तेमाल करते हैं)

यदि आप इन सभी विवरणों को नहीं देखना चाहते हैं, तो आप प्रोजेक्ट को दो भागों में विभाजित कर सकते हैं।

  1. बस अपने प्रोजेक्ट को सेटअप करने के लिए, स्प्रिंग प्रीलिफ़र की तरह अपना छोटा टूल बनाएं। (प्रतिलिपि फ़ाइल की तरह sth करें)
  2. आपका प्रोजेक्ट कोड

0

मैं Google मेघ एप्लिकेशन इंजन में वातावरण के बीच कॉन्फ़िगरेशन बदलने के लिए अलग-अलग ऐप .yaml फ़ाइल का उपयोग कर रहा हूं।

अपने टर्मिनल कमांड में प्रॉक्सी कनेक्शन बनाने के लिए आप इसका उपयोग कर सकते हैं:

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:1433

https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#macos-64-bit

फाइल: app.yaml

# [START django_app]
service: development
runtime: python37

env_variables:
  DJANGO_DB_HOST: '/cloudsql/myproject:myregion:myinstance'
  DJANGO_DEBUG: True

handlers:
# This configures Google App Engine to serve the files in the app's static
# directory.
- url: /static
  static_dir: static/

# This handler routes all requests not caught above to your main app. It is
# required when static routes are defined, but can be omitted (along with
# the entire handlers section) when there are no static files defined.
- url: /.*
  script: auto
# [END django_app]

-1

यह मेरा समाधान है, देव, परीक्षण और ठेस के लिए अलग-अलग वातावरण के साथ

import socket

[...]

DEV_PC = 'PC059'
host_name = socket.gethostname()

if host_name == DEV_PC:
   #do something
   pass
elif [...]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.