SQLite kullanırken Django development kullanmaya meyilliyim, ancak canlı bir sunucuda daha sağlam bir şeye ihtiyaç duyuluyor ( MySQL / PostgreSQL , örneğin). Her zaman, Django ayarlarında yapılacak başka değişiklikler de var: farklı kayıt yerleri/yoğunlukları, medya yolları vb.
Dağıtımı basit ve otomatik bir işlem yapmak için tüm bu değişiklikleri nasıl yönetirsiniz?
Update:Django-configurations , çoğu insan için manuel olarak yapmaktan daha iyi bir seçenek olan serbest bırakıldı.
İşleri manuel olarak yapmayı tercih ederseniz, önceki cevabım hala geçerlidir:
Birden fazla ayar dosyam var.
settings_local.py
- Veritabanı adı, dosya yolları vb. ana bilgisayara özgü 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 yapılandırma, ör. SERVER_EMAIL
.Bunları önce settings.py
, ardından diğer ikisinden birini alan bir settings_local.py
dosyasıyla birleştiriyorum. Hangi kodun settings_local.py
- DEVELOPMENT_HOSTS
ve PRODUCTION_HOSTS
içerisine yükleneceğine karar verir. Çalıştığı makinenin ana bilgisayar adını bulmak için settings.py
, platform.node()
işlevini çağırır ve ardından bu ana bilgisayar adını listelerde arar ve ana bilgisayar adını hangi listede bulduğuna bağlı olarak ikinci ayarlar dosyasını yükler.
Bu şekilde, endişelenmeniz gereken tek şey, settings_local.py
dosyasını Ana Bilgisayar'a özel yapılandırma ile güncel tutmak ve diğer her şey otomatik olarak ele alınır.
Bir örneğe göz atın here .
Şahsen, proje için tek bir settings.py kullanıyorum, sadece çalıştığı ana bilgisayar adını aradım (geliştirme makinelerimde "gabriel" ile başlayan ana bilgisayar adları var, bu yüzden şunu yaptım:
import socket
if socket.gethostname().startswith('gabriel'):
LIVEHOST = False
else:
LIVEHOST = True
o zaman diğer kısımlarda da şö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 düzgün çalışıyor ve birden fazla ayar dosyasını oynatmak zorunda kalmadan tasarruf sağlıyor.
Settings.py sonunda aşağıdakileri var:
try:
from settings_local import *
except ImportError:
pass
Bu yolla eğer varsayılan ayarları geçersiz kılmak istersem, settings.py 'nin hemen yanına settings_local.py koymam gerekiyor.
İki dosyam var. Genel/varsayılan ayarları içeren ve kaynak kontrolünde kontrol edilen settings_base.py
. Her dağıtımın başında settings.py
yürüten ve gerektiğinde geçersiz kılan ayrı bir from settings_base import *
işlevi vardır.
Bulduğum en basit yol şuydu:
1) yerel gelişim için varsayılan settings.py ve 2) .__ kullanın. İle başlayan bir production-settings.py oluşturun:
import os
from settings import *
Ve sonra sadece üretimde farklı olan ayarları geçersiz kılın:
DEBUG = False
TEMPLATE_DEBUG = DEBUG
DATABASES = {
'default': {
....
}
}
Bir miktar ilgili, Django’nun kendisini çoklu veritabanları ile dağıtma konusunda, Djangostack 'a göz atmak isteyebilirsiniz. Apache, Python, Django, vb. Yüklemenizi sağlayan tamamen ücretsiz bir yükleyici indirebilirsiniz. Yükleme işleminin bir parçası olarak kullanmak istediğiniz veritabanını seçmenize izin veriyoruz (MySQL, SQLite, PostgreSQL). Yükleyicileri, dağıtımları dahili olarak otomatikleştirirken (katılımsız modda çalıştırılabilirler) yoğun olarak kullanıyoruz.
Settings.py dosyam harici bir dizinde var. Bu şekilde, kaynak kontrolüne alınmaz veya bir konuşlandırma tarafından fazla yazılmaz. Bunu, herhangi bir varsayılan ayarın yanı sıra Django projem 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üvenemezseniz, bu çok tehlikelidir.
Peki, 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
Jim tarafından belirtilen çoklu ayar dosyalarına ek olarak, iki ayarın üstündeki settings.py dosyasına, kodun yoluna ayarlanan BASE_DIR
ve BASE_URL
adreslerine ve sitenin tabanına ve diğer ayarlara giden URL'ye yerleştirme eğilimindeyim. kendilerini bunlara eklemek için değiştirilmişlerdir.
BASE_DIR = "/home/sean/myapp/"
örn. MEDIA_ROOT = "%smedia/" % BASEDIR
Bu yüzden projeyi taşırken sadece bu ayarları düzenlemeliyim, tüm dosyayı aramam.
Ayrıca uzaktan dağıtımın otomasyonunu kolaylaştıran kumaş ve Capistrano (Ruby aracı, ancak Django uygulamalarını dağıtmak için kullanılabilir).
Bu daha eski bir yazı ama sanırım bu kullanışlı library
eklersem işleri kolaylaştıracak.
Kullanım Django-configuration
pip install Django-configurations
Ardından dahil edilen yapılandırmaları alt sınıflandırın. Projenizin settings.py içindeki yapılandırma sınıfı veya ayar sabitlerini saklamak için kullandığınız diğer herhangi bir modül, örneğin:
# mysite/settings.py
from configurations import Configuration
class Dev(Configuration):
DEBUG = True
Django_CONFIGURATION
ortam değişkenini, az önce oluşturduğunuz sınıfın adına ayarlayın; ~/.bashrc
içinde:
export Django_CONFIGURATION=Dev
ve Django_SETTINGS_MODULE
ortam değişkeni, her zaman olduğu gibi modül alma yoluna örn. kısaca:
export Django_SETTINGS_MODULE=mysite.settings
Alternatif olarak, Django yönetim komutlarını, Django'nun varsayılan --configuration
komut satırı seçeneği satırları boyunca kullanırken, örneğin: --settings
seçeneğini sağlar.
python manage.py runserver --settings=mysite.settings --configuration=Dev
Django'nun konfigürasyonunuzu kullanmasını sağlamak için, artık uygun başlangıç fonksiyonlarının Django konfigürasyonlarının versiyonlarını kullanmak için manage.py veya wsgi.py betiğinizi değiştirmeniz gerekir. Django yapılandırmalarını kullanan tipik bir manage.py işlevi şöyle görünür:
#!/usr/bin/env python
import os
import sys
if __== "__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. satırda dikkat edin, ortak Django.core.management.execute_from_command_line
aracını kullanmıyoruz, bunun yerine configurations.management.execute_from_command_line
.
Aynısı wsgi.py dosyanız için de geçerlidir.
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_application
işlevini kullanmıyoruz, bunun yerine configurations.wsgi.get_wsgi_application
işlevini kullanıyoruz.
Bu kadar! Artık projenizi manage.py ve favori WSGI özellikli sunucunuzla kullanabilirsiniz.
SQLite kullanarak adım atmanız gerekip gerekmediğine göre sitenin boyutuna bağlı olduğunu düşünüyorum, SQLite'yi daha küçük birkaç canlı sitede başarıyla kullandım ve çok iyi çalışıyor.
Ben ortamı kullanıyorum:
if os.environ.get('WEB_MODE', None) == 'production' :
from settings_production import *
else :
from settings_dev import *
Bunun daha iyi bir yaklaşım olduğuna inanıyorum, çünkü sonunda test ortamınız için özel ayarlara ihtiyacınız var ve bu koşula kolayca ekleyebilirsiniz.
Çok karmaşık cevaplar!
Her settings.py dosyası ile birlikte gelir:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG değişkenini bu şekilde ayarlamak için bu dizini kullanıyorum (dev kodunun bulunduğu dizine sahip):
DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
DEBUG = True
Ardından, settings.py dosyası her taşındığında, DEBUG False olacak ve sizin üretim ortamınız.
Dev ortamınızdaki ayarlardan farklı ayarlara her ihtiyaç duyduğunuzda, sadece şunları kullanın:
if(DEBUG):
#Debug setting
else:
#Release setting