Django: จะจัดการการตั้งค่าการพัฒนาและการผลิตได้อย่างไร?


129

ฉันได้พัฒนาแอปพื้นฐาน ตอนนี้ในขั้นตอนการปรับใช้เป็นที่ชัดเจนว่าฉันต้องการทั้งการตั้งค่าภายในเครื่องและการตั้งค่าการใช้งานจริง

จะเป็นการดีที่จะทราบสิ่งต่อไปนี้:

  • วิธีจัดการกับการตั้งค่าการพัฒนาและการผลิตให้ดีที่สุด
  • วิธีเก็บแอปเช่น django-debug-toolbar ไว้ในสภาพแวดล้อมการพัฒนาเท่านั้น
  • เคล็ดลับและแนวทางปฏิบัติที่ดีที่สุดอื่น ๆ สำหรับการตั้งค่าการพัฒนาและการปรับใช้

คำตอบ:


109

DJANGO_SETTINGS_MODULEตัวแปรสภาพแวดล้อมของการควบคุมการตั้งค่าไฟล์ Django จะโหลด

ดังนั้นคุณจึงสร้างไฟล์การกำหนดค่าแยกกันสำหรับสภาพแวดล้อมของคุณ (โปรดทราบว่าแน่นอนว่าไฟล์เหล่านี้สามารถimport *มาจากไฟล์ "การตั้งค่าที่ใช้ร่วมกัน" แยกต่างหาก) และใช้DJANGO_SETTINGS_MODULEเพื่อควบคุมว่าจะใช้ไฟล์ใด

วิธีการมีดังนี้

ตามที่ระบุไว้ในเอกสาร Django:

ค่าของ DJANGO_SETTINGS_MODULE ควรอยู่ในไวยากรณ์พา ธ Python เช่น mysite.settings โปรดทราบว่าโมดูลการตั้งค่าควรอยู่บนเส้นทางการค้นหาการนำเข้า Python

สมมติว่าคุณสร้าง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โดยใช้สคริปต์หรือเชลล์

จากนั้นคุณสามารถใช้สคริปต์บูตหรือผู้จัดการกระบวนการที่จะโหลดการตั้งค่าที่ถูกต้อง (โดยการตั้งค่าสภาพแวดล้อม) หรือเพียงแค่เรียกใช้จากเปลือกของคุณก่อนที่จะเริ่ม export DJANGO_SETTINGS_MODULE=myapp.production_settingsDjango:

โปรดทราบว่าคุณสามารถเรียกใช้การส่งออกนี้ได้ตลอดเวลาจากเชลล์ - ไม่จำเป็นต้องอยู่ในของคุณ.bashrcหรืออะไรเลย

การตั้งค่าDJANGO_SETTINGS_MODULEโดยใช้ตัวจัดการกระบวนการ

หากคุณไม่ชอบเขียนสคริปต์ bootstrap ที่กำหนดสภาพแวดล้อม (และมีเหตุผลที่ดีมากที่จะรู้สึกเช่นนั้น!) ฉันขอแนะนำให้ใช้ตัวจัดการกระบวนการ:


สุดท้ายโปรดทราบว่าคุณสามารถใช้ประโยชน์จากPYTHONPATHตัวแปรเพื่อจัดเก็บการตั้งค่าในตำแหน่งที่ตั้งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง (เช่นบนเซิร์ฟเวอร์ที่ใช้งานจริงเก็บไว้ใน/etc/) สิ่งนี้ช่วยให้สามารถแยกการกำหนดค่าออกจากไฟล์แอปพลิเคชัน คุณอาจต้องการหรือไม่ต้องการก็ได้ขึ้นอยู่กับว่าแอปของคุณมีโครงสร้างอย่างไร


7
เพื่อชี้แจงเนื่องจากsettings.pyไฟล์ถูกเก็บไว้SiteName/settings.pyตามค่าเริ่มต้นหากคุณวางไฟล์การตั้งค่าทางเลือกไว้ในไดเร็กทอรีเดียวกันบรรทัดที่เพิ่มไปยัง bin / เปิดใช้งานควรอ่านDJANGO_SETTINGS_MODULE="SiteName.test_settings"เป็นอย่างอื่นคำตอบที่ยอดเยี่ยม!
alexbhandari

2
โดยบังเอิญคุณรู้บทช่วยสอนเกี่ยวกับวิธีการทำทีละขั้นตอนฉันเพิ่งเริ่มใช้ Django และไม่รู้ว่าจะตั้ง DJANGO_SETTINGS_MODULE หรือ PYTHONPATH
Jesus Almaral - Hackaprende เมื่อ

โซลูชันนี้ดูเหมือนจะไม่เป็นจริงสำหรับ conda env ไม่มี bin / เปิดใช้งานใน conda env
Pouya Yousefi

1
@PouyaYousefi: คุณไม่จำเป็นต้องใช้ Virtualenv เพื่อใช้คำตอบนี้ คำตอบแบ่งออกเป็นสองขั้นตอน: ก) ใช้ไฟล์การตั้งค่าแยกต่างหากและ b) ใช้DJANGO_SETTINGS_MODULEเพื่อเลือกไฟล์ที่คุณต้องการใช้ การปรับเปลี่ยนbin/activate เป็นสิ่งที่ต้องทำอย่างหลัง (TBH ฉันไม่คิดว่านี่เป็นความคิดที่ดีอีกต่อไปแล้วดังนั้นฉันจึงเอามันออก) แต่มันไม่ใช่อย่างเดียว
Thomas Orozco

นอกจากนี้ยังมีประโยชน์หากคุณใช้ Django ใน pycharm community edition และคุณต้องเรียกใช้การทดสอบหน่วยทั้งในบรรทัดคำสั่งและชุมชน pycharm อย่างถูกต้อง สมมติว่าคุณสร้างไฟล์กำหนดค่าอย่างง่ายเพียงไฟล์เดียวใน myapp / settings.py ในที่เก็บซอร์สของคุณ ในกรณีนี้คุณต้องตั้งค่า“ DJANGO_SETTINGS_MODULE = myapp.settings” ในเมนู RUN / Edit Configuration / Environment เพื่อใช้ในการเรียกใช้กรณีทดสอบ
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

(โปรดทราบว่า*โดยทั่วไปควรหลีกเลี่ยงการนำเข้าใน Python)

โดยค่าเริ่มต้นเซิร์ฟเวอร์ที่ใช้งานจริงจะไม่แทนที่สิ่งใด ๆ ทำ!

เมื่อเทียบกับคำตอบอื่น ๆ คำตอบนี้ง่ายกว่าเพราะไม่ต้องอัปเดต PYTHONPATHหรือการตั้งค่าDJANGO_SETTINGS_MODULEที่อนุญาตให้คุณทำงานกับโครงการ django ทีละโครงการเท่านั้น


8
นี่ไม่ใช่คำตอบที่ถูกต้องอย่างไร ดังนั้นในปัจจุบันเป็นเรื่องยุ่งมาก Ty cs01
codyc4321

if os.environ.get('DJANGO_DEVELOPMENT', 'true')ยังใช้งานได้ ฉันพูดถึงสิ่งนี้เพียงเพราะis not trueวิธีการข้างต้นล้มเหลวในการนำเข้าสำหรับฉันใน Python 3.6
brt

1
@brt นี่เป็นความคิดที่ไม่ดี: มันจะใช้DEVการตั้งค่าของคุณเสมอซึ่งจะทำให้ข้อมูลส่วนตัวรั่วไหลบนเซิร์ฟเวอร์สาธารณะ คุณแค่ต้องการตรวจสอบว่าDJANGO_DEVELOPMENTตัวแปรสภาพแวดล้อมมีอยู่จริง (เช่นis not None)
cs01

ขอบคุณสำหรับข้อมูล @ cs01 ฉันรู้ว่าฉันทำบางอย่างผิดพลาดเมื่อฉันระเบิดไซต์ของฉันด้วยการโหลดการตั้งค่าที่ไม่ถูกต้อง แต่ฉันไม่แน่ใจว่าเหตุใดจึงsettings_dev.pyโหลดบนเซิร์ฟเวอร์
brt

2
@ cs01 ฉันจะไปให้ไกลที่สุดเพื่อให้แน่ใจว่ามันมีอยู่จริงและเป็นความจริงเพียงแค่ทิ้งis not Noneเช็ค ยังos.getenvเป็นชวเลข
Tjorriemorrie

35

ฉันมักจะมีไฟล์การตั้งค่าหนึ่งไฟล์ต่อสภาพแวดล้อมและไฟล์การตั้งค่าที่แชร์:

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

ไฟล์สภาพแวดล้อมแต่ละไฟล์ของฉันมี:

try:
    from shared_settings import *
except ImportError:
    pass

สิ่งนี้ทำให้ฉันสามารถลบล้างการตั้งค่าที่ใช้ร่วมกันได้หากจำเป็น (โดยการเพิ่มการแก้ไขด้านล่างบทนั้น)

จากนั้นฉันเลือกไฟล์การตั้งค่าที่จะใช้โดยเชื่อมโยงเข้ากับ settings.py:

ln -s settings.development.py settings.py

2
คุณจัดการกับข้อห้ามของ pep8 import *อย่างไร? คุณปิดการใช้งานการตรวจสอบนั้นหรือไม่ ฉันได้รวมการนำเข้านี้ไว้exec()แต่แล้วฉันไม่สามารถมีเงื่อนไขกับตัวแปรที่ไม่ได้กำหนดไว้ในไฟล์นี้และฉันไม่สามารถแก้ไขINSTALLED_APPSตัวแปรได้เนื่องจาก "ไม่ได้กำหนด"
มิคาอิล

11
เราไม่ทำลายไฟล์การตั้งค่าของเราเพราะมันไม่ได้ใช้โค้ดมากเท่ากับการกำหนดค่าที่แสดงใน Python
Daniel Watkins

18

นี่คือวิธีการทำใน 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 = [...]
    ...

ตอนนี้ {% expands 'base.html'%} ไม่ทำงาน คุณเปลี่ยนอะไรอีกไหม?
cikatomo

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']))

เพื่อนำเข้าตัวแปรที่คุณต้องการแก้ไข

รายการวิกินี้มีแนวคิดเพิ่มเติมเกี่ยวกับวิธีแยกการตั้งค่าของคุณ


ขอบคุณ Burham! เมื่อปรับใช้แอปฉันจะต้องลบไฟล์ settings_dev ออกเพื่อดูการตั้งค่าการปรับใช้ของฉันในการดำเนินการ?
Kristian Roebuck

ใช่หรือแทนที่การนำเข้าด้วยsettings_prod.py
Burhan Khalid

1
การแก้ไขไฟล์ settings.py หลักในการปรับใช้หมายความว่าจะขัดแย้งกับการควบคุมเวอร์ชันดังนั้นจึงไม่จำเป็นต้องเป็นวิธีที่ดีที่สุดในการส่งต่อ ฉันจะบอกว่าตัวเลือกของ Thomas Orozco ดีที่สุด - คุณสามารถตั้งค่า DJANGO_SETTINGS_MODULE ในสคริปต์หลังการใช้งาน Virtualenv ของคุณหรือในการตั้งค่า gunicorn หรือ mod_wsgi
Steve Jalim

1
บางทีควรกล่าวถึงว่าคุณไม่ควรเพิ่มลงในซอร์สควบคุมไฟล์เฉพาะสเตจ ฉันคิดว่าเป็นที่เข้าใจว่าคุณจะไม่ผลักดันการตั้งค่าที่เฉพาะเจาะจงสำหรับขั้นตอนของโครงการ
Burhan Khalid

หากคุณใช้ Virtualenv โดยทั่วไปค่าเริ่มต้นจะเป็น {{project_name}} ดังนั้น 'การตั้งค่า' จะไม่เป็นกุญแจสำคัญในระบบโมดูล มันจะเป็น "myproject.settings" (หรือชื่อโปรเจ็กต์ของคุณ) คุณสามารถใช้เพื่อให้ได้ชื่อโมดูลเต็มรูปแบบแล้วmodname = "%s.settings" % ".".join(__name__.split('.')[:-1]) globals().update(vars(sys.modules[modname]))ฉันพบว่ามันได้ผลดีสำหรับฉัน แน่นอนว่าการไม่ใช้บิตเกี่ยวกับการกำหนดชื่อโมดูลโดยทางโปรแกรมเพื่อสนับสนุนสตริงก็น่าจะใช้ได้ในกรณีส่วนใหญ่เช่นกัน
Eric

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',
    }
}

ประโยชน์ของโซลูชันนี้คือ:

  • ข้อมูลรับรองและการกำหนดค่าเฉพาะของผู้ใช้สำหรับการพัฒนาเฉพาะที่โดยไม่ต้องแก้ไขที่เก็บ git
  • การกำหนดค่าเฉพาะสภาพแวดล้อมคุณสามารถมีได้เช่นสามสภาพแวดล้อมที่แตกต่างกันซึ่งมีสามแบบที่แตกต่างกัน.env.jsonเช่น dev, stagging และ production
  • หนังสือรับรองไม่ได้อยู่ในที่เก็บ

ฉันหวังว่านี่จะช่วยได้เพียงแจ้งให้เราทราบหากคุณเห็นข้อควรระวังในการแก้ปัญหานี้


สมมติว่าที่envคือการแทนที่ด้วยdev, prodฯลฯ ? settings.pyไฟล์เก่ามีอะไรบ้าง? อะไรอยู่ในstorage.pyและdatabase.py?
dbinott

สวัสดี @dbinott คุณสามารถอัปเดตenv.pyไฟล์ได้อย่างง่ายดายเพื่อให้คุณสามารถเลือกได้โดยมีตัวแปรสภาพแวดล้อมว่าจะโหลดไฟล์ใด
Charlesthk

ตัวอย่างเช่น conf = os.environ.get ('CONF', '') file_ = f ".env. {conf} .json"
Charlesthk

เหตุใดคุณจึงใช้ json เมื่อเทียบกับประเภทข้อมูล python ดั้งเดิม
airstrike

4

ฉันใช้โครงสร้างไฟล์ folloring:

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

ดังนั้นจึง__init__.pyเป็นลิงค์ (ln ใน unix หรือ mklink ใน windows) ไปยังlocal.pyหรือเป็นไปได้เพื่อprod.pyให้การกำหนดค่ายังคงอยู่ในproject.settingsโมดูลนั้นสะอาดและเป็นระเบียบและหากคุณต้องการใช้ config เฉพาะคุณสามารถใช้ตัวแปรสภาพแวดล้อม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 ไม่จำเป็นต้องอ่านไฟล์การตั้งค่าทั้งหมดก่อนที่จะเรียกใช้ไฟล์การตั้งค่าที่เหมาะสม โซลูชันนี้มีประโยชน์หากไฟล์การผลิตของคุณต้องการสิ่งที่อยู่บนเซิร์ฟเวอร์การผลิตของคุณเท่านั้น

หมายเหตุ: ใน Python 3 ไฟล์ที่นำเข้าจำเป็นต้องมีการ.ต่อท้าย (เช่นfrom .settings_dev import *)


1

หากคุณต้องการเก็บไฟล์การตั้งค่าไว้ 1 ไฟล์และระบบปฏิบัติการสำหรับการพัฒนาของคุณแตกต่างจากระบบปฏิบัติการที่ใช้งานจริงคุณสามารถวางไว้ที่ด้านล่างของ settings.py:

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

อ่านเพิ่มเติม: ฉันจะตรวจสอบระบบปฏิบัติการใน Python ได้อย่างไร


1

ดูเหมือนว่าจะได้รับคำตอบอย่างไรก็ตามวิธีที่ฉันใช้ร่วมกับการควบคุมเวอร์ชันมีดังต่อไปนี้:

ตั้งค่าไฟล์ env.py ในไดเร็กทอรีเดียวกับการตั้งค่าในสภาพแวดล้อมการพัฒนาท้องถิ่นของฉันที่ฉันเพิ่มลงใน. gitignore:

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

ฉันเพิ่งพบว่ามันใช้งานได้และดูหรูหรากว่ามาก - ด้วย env.py มันเป็นเรื่องง่ายที่จะเห็นตัวแปรสภาพแวดล้อมในพื้นที่ของเราและเราสามารถจัดการทั้งหมดนี้ได้โดยไม่ต้องมีไฟล์ settings.py หลายไฟล์หรือสิ่งที่ชอบ วิธีนี้ช่วยให้สามารถใช้ตัวแปรสภาพแวดล้อมโลคัลทุกประเภทที่เราไม่ต้องการตั้งค่าบนเซิร์ฟเวอร์การผลิตของเรา การใช้. gitignore ผ่านการควบคุมเวอร์ชันเรายังทำให้ทุกอย่างรวมเข้าด้วยกันอย่างราบรื่น


วิธีแก้ปัญหาที่ง่ายที่สุด เราสามารถกำหนดทุกอย่างในConfigคลาสภายในenv.pyไฟล์ได้ แล้วแทนที่จะเป็นโมดูลที่สามารถนำเข้าโดยimport * from env import Configด้วยวิธีนี้คุณไม่จำเป็นต้องใช้ if os.pathcheck ซึ่งทำให้ทุกอย่างง่ายขึ้นมาก
Siddharth Pant

0

ใช้settings.pyสำหรับการผลิต ในไดเร็กทอรีเดียวกันสร้างsettings_dev.pyสำหรับการลบล้าง

# settings_dev.py

from .settings import * 

DEBUG = False

บนเครื่อง dev ให้เรียกใช้แอป Django ของคุณด้วย:

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

บนเครื่อง prod ทำงานราวกับว่าคุณเพิ่งมี settings.pyและไม่มีอะไรอื่น

ข้อดี

  1. settings.py (ใช้สำหรับการผลิต) ไม่เชื่อเรื่องพระเจ้าโดยสิ้นเชิงกับความจริงที่ว่าสภาพแวดล้อมอื่น ๆ มีอยู่จริง
  2. เห็นความแตกต่างระหว่างแยงและ Dev คุณเพียงแค่มองเข้าไปในสถานที่เดียว settings_dev.py- ไม่จำเป็นที่จะรวบรวมการกำหนดค่ากระจัดกระจายไปทั่วsettings_prod.py, settings_dev.pyและsettings_shared.pyและ
  3. หากมีคนเพิ่มการตั้งค่าในการกำหนดค่า prod ของคุณหลังจากแก้ไขปัญหาการใช้งานจริงคุณสามารถมั่นใจได้ว่าจะปรากฏในการกำหนดค่า dev ของคุณเช่นกัน (เว้นแต่จะถูกแทนที่อย่างชัดเจน) ดังนั้นความแตกต่างระหว่างไฟล์กำหนดค่าต่างๆจะถูกย่อให้เล็กที่สุด

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จะเข้ามาแทนที่

วิธีการเลือก env ที่แตกต่างกัน?

  • ปรับเปลี่ยน __init__.pyโดยตรง
  • สร้างไฟล์ bash เพื่อแก้ไข __init__.pyทำให้ไฟล์ทุบตีเพื่อปรับเปลี่ยน
  • แก้ไข env ใน linux จากนั้นให้__init__.pyอ่านตัวแปรนี้

ทำไมต้องใช้วิธีนี้?

เนื่องจากฉันไม่ชอบไฟล์จำนวนมากในไดเร็กทอรีเดียวกันไฟล์จำนวนมากเกินไปจะทำให้คู่ค้ารายอื่นสับสนและไม่เหมาะสำหรับ IDE (IDE ไม่พบไฟล์ที่เราใช้)

หากคุณไม่ต้องการดูรายละเอียดทั้งหมดนี้คุณสามารถแบ่งโครงการออกเป็นสองส่วน

  1. สร้างเครื่องมือขนาดเล็กของคุณเช่น Spring Initializr เพียงเพื่อตั้งค่าโครงการของคุณ (ทำเหมือนไฟล์คัดลอก)
  2. รหัสโครงการของคุณ

0

ฉันใช้ไฟล์ app.yaml อื่นเพื่อเปลี่ยนการกำหนดค่าระหว่างสภาพแวดล้อมในแอป Google Cloud App Engine

คุณสามารถใช้สิ่งนี้เพื่อสร้างการเชื่อมต่อพร็อกซีในคำสั่งเทอร์มินัลของคุณ:

./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

นี่คือวิธีแก้ปัญหาของฉันโดยมีสภาพแวดล้อมที่แตกต่างกันสำหรับ dev, test และ prod

import socket

[...]

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

if host_name == DEV_PC:
   #do something
   pass
elif [...]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.