Django'yu basit geliştirme ve dağıtım için nasıl yapılandırırsınız?


112

Django geliştirme yaparken SQLite kullanma eğilimindeyim , ancak canlı bir sunucuda genellikle daha sağlam bir şeye ihtiyaç duyulmaktadır ( örneğin MySQL / PostgreSQL ). Değişmez bir şekilde, Django ayarlarında yapılacak başka değişiklikler de vardır: farklı kayıt konumları / yoğunlukları, medya yolları vb.

Dağıtımı basit ve otomatik bir süreç haline getirmek için tüm bu değişiklikleri nasıl yönetiyorsunuz?


Görünüşe göre başkaları kadar süslü bir şey yapmıyorum :). Sadece django'nun sağladığı ORM'den yararlanıyorum.
Andrew Sledge

1
Soru, ortamlar arasında geçiş yapmak için ayarların değiştirilmesinin nasıl otomatikleştirileceğiydi :-)
Guruprasad


Bu pakete bir göz atabilirsiniz: django-split-settings
sobolevn

Yanıtlar:


86

Güncelleme: django-konfigürasyonları yayınlandı ve bu muhtemelen çoğu insan için manuel olarak yapmaktan daha iyi bir seçenek.

İşleri manuel olarak yapmayı tercih ederseniz, önceki cevabım yine de geçerlidir:

Birden çok ayar dosyam var.

  • settings_local.py - veritabanı adı, dosya yolları vb. gibi ana bilgisayara özel yapılandırma.
  • settings_development.py- geliştirme için kullanılan yapılandırma, ör DEBUG = True.
  • settings_production.py- üretim için kullanılan konfigürasyon, örn SERVER_EMAIL.

Bunları settings.pyönce içe aktaran bir dosyayla settings_local.py, ardından diğer ikisinden birini birbirine bağlarım . Hangisinin yükleneceğini iki ayara göre belirler settings_local.py- DEVELOPMENT_HOSTSve PRODUCTION_HOSTS. settings.pyçağrılar platform.node()üzerinde çalıştığı makinenin makine adını bulun ve ardından ana makine adını buluyor liste bağlı ikinci ayar dosyasını listelerindeki o hostname arar ve yükler için.

Bu şekilde, gerçekten endişelenmeniz gereken tek şey, settings_local.pydosyayı ana bilgisayara özel yapılandırma ile güncel tutmaktır ve diğer her şey otomatik olarak işlenir.

Bir örneğe buradan göz atın .


2
ya hazırlık (geliştirme) ve üretim aynı makinedeyse? platform.node () aynı şeyi döndürür.
gwaramadze

2
Örnek bağlantı çalışmıyor.
Jickson

Ayarları ana bilgisayar listelerine göre belirlemek için harika bir fikir! Benim bir nitpickim isimlendirme (settings_local.py her zaman önce içe aktarılır, bu nedenle geçersiz kılınmayan ayarlar aslında üretimde aktif olacak ve soneki _localoldukça kafa karıştırıcı hale getirecektir ) ve modülleri kullanmadığınız gerçeğidir (ayarlar /base.py, settings / local.py, settings / production.py). Bunu ayrı bir depoda tutmak da akıllıca olacaktır ... daha da iyisi, bu bilgiyi kanonik bir kaynaktan sunan güvenli bir hizmet (muhtemelen çoğu için fazla) ... böylece yeni ana bilgisayar yeni bir sürüm gerektirmez.
DylanYoung

Daha da iyisi, .pydosyadaki ana bilgisayar listesini kontrol etmek ve böylece her ana bilgisayarın diğer her ana bilgisayarın yapılandırması hakkındaki bilgilere erişimini sağlamak yerine makine yönetim yazılımı kullanıyorsanız, uygun ayarları kullanmak için manage.py şablonunu kullanabilirsiniz. dağıtım yapılandırmalarınızdaki dosya.
DylanYoung

26

Şahsen, proje için tek bir settings.py kullanıyorum, sadece üzerinde bulunduğu ana makine adına bakmam gerekiyor (geliştirme makinelerim "gabriel" ile başlayan ana bilgisayar adlarına sahip, bu yüzden sadece şuna sahibim:

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

diğer bölümlerde şöyle şeyler var:

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

ve bunun gibi. Biraz daha az okunabilir, ancak iyi çalışıyor ve birden fazla ayar dosyasıyla uğraşmaktan kurtarıyor.


Bu fikri beğendim, ancak aynı ana bilgisayarda çalışan farklı Django örneklerini ayırt etmeme izin vermiyor. Örneğin, aynı ana bilgisayarda farklı alt alanlar için çalışan farklı örnekleriniz varsa bu gerçekleşebilir.
Erik

24

Settings.py'nin sonunda aşağıdakilere sahibim:

try:
    from settings_local import *
except ImportError:
    pass

Bu şekilde, varsayılan ayarları geçersiz kılmak istersem, sadece settings_local.py'yi settings.py'nin hemen yanına koymam gerekir.


4
Bu biraz tehlikelidir, çünkü bir yazım hatası bir ile settings_localsonuçlanırsa ImportError, bu exceptonu sessizce yutacaktır.
Chris Martin

Mesajı kontrol edebilir No module named...vs cannot import name...ama kırılgan. Veya içe aktarmalarınızı try bloklarında settings_local.py'ye koyun ve daha spesifik bir istisna: MisconfiguredSettingsveya bu etkiye sahip bir şey.
DylanYoung

11

İki dosyam var. settings_base.pyortak / varsayılan ayarları içeren ve kaynak kontrolünde kontrol edilen. Her dağıtım ayrı sahip settings.pyolan yürütür, from settings_base import *gerektiği gibi geçersiz başlangıcında ve.


1
Bunu ben de kullanıyorum. Tersinden daha üstündür (dmishe'nin "settings.py'nin sonunda" settings_local içe aktarımından * "), çünkü yerel ayarların gerekirse global olanlara erişmesine ve bunları değiştirmesine izin verir.
Carl Meyer

3
Bunu settings_local.pyyaparsa from settings import *, içindeki değerleri geçersiz kılabilir settings.py. ( settings_local.pydosyanın sonunda içe aktarılması gerekir settings.py).
Seth

Bu yine de yapılabilir. Yukarıdaki stackoverflow.com/a/7047633/3124256 adresine bir göz atın . @Seth Bu döngüsel bir ithalat için bir reçete.
DylanYoung

7

Bulduğum en basit yol şuydu:

1) yerel geliştirme için varsayılan settings.py'yi kullanın ve 2) şununla başlayarak bir production-settings.py oluşturun :

import os
from settings import *

Ve sonra üretimde farklılık gösteren ayarları geçersiz kılın:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


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

Django, üretim ayarlarını yüklemeyi nasıl biliyor?
AlxVallejo

2

Bir şekilde ilgili olarak, Django'nun kendisini birden fazla veri tabanına yerleştirme meselesi için, Djangostack'e bir göz atmak isteyebilirsiniz . Apache, Python, Django, vb. Yüklemenize izin veren tamamen ücretsiz bir yükleyici indirebilirsiniz. Yükleme işleminin bir parçası olarak, kullanmak istediğiniz veritabanını (MySQL, SQLite, PostgreSQL) seçmenize izin veriyoruz. Dağıtımları dahili olarak otomatikleştirirken yükleyicileri yoğun bir şekilde kullanırız (katılımsız modda çalıştırılabilirler).


1
Alternatif olarak , önceden yüklenmiş django ile Ubuntu * NIX yığınına dayalı Django Anahtar Teslimi Linux'u önermek istiyorum .
jochem

1

Settings.py dosyam harici bir dizinde var. Bu şekilde, kaynak kontrolüne girilmez veya bir dağıtım tarafından üzerine yazılmaz. Bunu, varsayılan ayarlarla birlikte Django projemin altındaki settings.py dosyasına koydum:

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")

Not: local_settings.py'ye güvenemiyorsanız bu çok tehlikelidir.


1

Jim bahsettiği çoklu ayarlar dosyalarına ek olarak, ben de yere üstündeki benim settings.py dosyası içine iki ayar eğilimindedir BASE_DIRve BASE_URLkodu ve sitenin tabanına URL yolu olarak seti, tüm diğer ayarlar değiştirilir kendilerini bunlara eklemek için.

BASE_DIR = "/home/sean/myapp/" Örneğin MEDIA_ROOT = "%smedia/" % BASEDIR

Bu yüzden projeyi taşırken sadece bu ayarları düzenlemem gerekiyor ve tüm dosyayı aramam gerekiyor.

Ayrıca , uzaktan dağıtımın otomasyonunu kolaylaştıran kumaş ve Capistrano'ya (Ruby aracı, ancak Django uygulamalarını dağıtmak için kullanılabilir) bakmanızı tavsiye ederim .


Ansible bir python'dur ve Fabric'ten çok daha sağlam provizyon olanakları sunar. Onlar da güzel eşleşiyorlar.
DylanYoung

1

Ben bu konfigürasyonu kullanıyorum:

Settings.py'nin sonunda:

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

Ve locale_settings.py içinde:

#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

Pek çok karmaşık cevap!

Her settings.py dosyası şunlarla birlikte gelir:

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

Bu dizini DEBUG değişkenini şu şekilde ayarlamak için kullanıyorum (dev kodunuzun olduğu dizinle yeniden yerleştirin):

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

Ardından, settings.py dosyası her taşındığında, DEBUG False olur ve bu sizin üretim ortamınızdır.

Geliştirme ortamınızdakilerden farklı ayarlara ihtiyaç duyduğunuz her seferinde şunları kullanın:

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

0

Sanırım bu, sitenin boyutuna bağlı olarak, SQLite kullanmaktan adım atmanız gerekip gerekmediğine bağlı, SQLite'i birkaç küçük canlı sitede başarıyla kullandım ve harika çalışıyor.


0

Çevre kullanıyorum:

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

Bunun çok daha iyi bir yaklaşım olduğuna inanıyorum, çünkü sonunda test ortamınız için özel ayarlara ihtiyacınız olacak ve onu bu duruma kolayca ekleyebilirsiniz.


0

Bu daha eski bir gönderi ama sanırım bunu yararlı libraryeklersem işleri basitleştirecek.

Django yapılandırmasını kullan

Hızlı başlangıç

pip install django-configurations

Ardından, projenizin settings.py veya ayar sabitlerini saklamak için kullandığınız diğer modüllerde dahil edilen configuration.Configuration sınıfını alt sınıflara ayırın, örneğin:

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

DJANGO_CONFIGURATIONOrtam değişkenini yeni oluşturduğunuz sınıfın adına ayarlayın , örneğin ~/.bashrc:

export DJANGO_CONFIGURATION=Dev

ve DJANGO_SETTINGS_MODULEmodül içe aktarma yoluna ortam değişkeni her zamanki gibi, örneğin bash'da:

export DJANGO_SETTINGS_MODULE=mysite.settings

Alternatif tedarik --configurationDjango'nın varsayılan çizgisinde Django yönetim komutlarını kullanırken seçeneği --settingskomut satırı seçeneği, örneğin:

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

Django'nun yapılandırmanızı kullanmasını sağlamak için, şimdi manage.py veya wsgi.py betiğinizi, uygun başlatma işlevlerinin django-configuration sürümlerini kullanacak şekilde değiştirmeniz gerekir , örneğin, django-configuration kullanan tipik bir manage.py şuna benzer:

#!/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)

Uyarı hattı 10'da ortak aracı kullanmayın django.core.management.execute_from_command_line, bunun yerine configurations.management.execute_from_command_line.

Aynısı wsgi.py dosyanız için de geçerlidir , örneğin:

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()

Burada varsayılan django.core.wsgi.get_wsgi_applicationişlevi değil, onun yerine kullanıyoruz configurations.wsgi.get_wsgi_application.

Bu kadar! Artık projenizi manage.py ve en sevdiğiniz WSGI etkin sunucuyla kullanabilirsiniz.


-2

Aslında, geliştirme ve üretim ortamınız için muhtemelen aynı (veya neredeyse aynı) yapılandırmalara sahip olmayı düşünmelisiniz. Aksi takdirde zaman zaman "Hey, benim makinemde çalışıyor" gibi durumlar yaşanacaktır.

Yani bu WOMM konularını da dağıtımını otomatik ve ortadan kaldırmak amacıyla, sadece kullanmak Docker .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.