it-swarm-tr.com

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

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?

109
reppimp

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 .

84
Jim

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

25
Gabriel Ross

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.

22

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

11
John Millikin

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': {
           ....
    }
}
7
Andre Bossard

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.

2
Josue

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.  

1
Chase Seibert

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
1
sacabuche

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

1
Sean O Donnell

Bu daha eski bir yazı ama sanırım bu kullanışlı library eklersem işleri kolaylaştıracak.

Kullanım Django-configuration

Hızlı başlangıç

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.

0
Little Phild

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.

0
Ycros

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.

0
slashmili

Ç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
0
JM Desrosiers