it-swarm-id.com

Bagaimana Anda mengonfigurasi Django untuk pengembangan dan penerapan sederhana?

Saya cenderung menggunakan SQLite ketika melakukan pengembangan Django , Tetapi pada server langsung, sesuatu yang lebih kuat adalah Sering dibutuhkan ( MySQL / PostgreSQL , misalnya ) . Selalu, ada perubahan lain untuk membuat pengaturan Django .__ juga: lokasi/intensitas logging yang berbeda, .__ jalur media, dll.

Bagaimana Anda mengelola semua perubahan ini untuk menjadikan penyebaran sebagai proses sederhana dan otomatis?

109
reppimp

Perbarui:Django-konfigurasi telah dirilis yang mungkin merupakan pilihan yang lebih baik bagi kebanyakan orang daripada melakukannya secara manual.

Jika Anda lebih suka melakukan hal-hal secara manual, jawaban saya sebelumnya masih berlaku:

Saya memiliki beberapa file pengaturan.

  • settings_local.py - Konfigurasi khusus host, seperti nama basis data, jalur file, dll.
  • settings_development.py - konfigurasi yang digunakan untuk pengembangan, mis. DEBUG = True.
  • settings_production.py - konfigurasi yang digunakan untuk produksi, mis. SERVER_EMAIL.

Saya mengikat semua ini bersama-sama dengan file settings.py yang pertama-tama mengimpor settings_local.py, dan kemudian salah satu dari dua lainnya. Ini memutuskan yang memuat oleh dua pengaturan di dalam settings_local.py - DEVELOPMENT_HOSTS dan PRODUCTION_HOSTS. settings.py memanggil platform.node() untuk menemukan nama host dari mesin yang sedang berjalan, dan kemudian mencari nama host itu dalam daftar, dan memuat file pengaturan kedua tergantung pada daftar di mana ia menemukan nama host tersebut.

Dengan begitu, satu-satunya hal yang Anda benar-benar perlu khawatirkan adalah menjaga file settings_local.py tetap up to date dengan konfigurasi khusus Host, dan semua yang lain ditangani secara otomatis.

Lihat contoh sini .

84
Jim

Secara pribadi, saya menggunakan satu pengaturan.py untuk proyek ini, saya hanya perlu mencari hostname-nya (mesin pengembangan saya memiliki nama host yang dimulai dengan "gabriel" jadi saya hanya perlu ini:

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

kemudian di bagian lain saya memiliki hal-hal seperti:

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

dan seterusnya. Sedikit kurang dapat dibaca, tetapi berfungsi dengan baik dan menghemat harus menyulap beberapa file pengaturan.

25
Gabriel Ross

Di akhir settings.py saya memiliki yang berikut:

try:
    from settings_local import *
except ImportError:
    pass

Dengan cara ini jika saya ingin mengesampingkan pengaturan standar saya hanya perlu meletakkan settings_local.py tepat di sebelah settings.py.

22

Saya punya dua file. settings_base.py yang berisi pengaturan umum/default, dan yang diperiksa ke dalam kontrol sumber. Setiap penyebaran memiliki settings.py terpisah, yang mengeksekusi from settings_base import * di awal dan kemudian menimpa sesuai kebutuhan.

11
John Millikin

Cara paling sederhana yang saya temukan adalah:

1) gunakan default settings.py untuk pengembangan lokal dan 2) Buat production-settings.py dimulai dengan:

import os
from settings import *

Dan kemudian hanya menimpa pengaturan yang berbeda dalam produksi:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}
7
Andre Bossard

Agak terkait, untuk masalah penyebaran Django sendiri dengan banyak basis data, Anda mungkin ingin melihat Djangostack . Anda dapat mengunduh pemasang yang benar-benar gratis yang memungkinkan Anda untuk menginstal Apache, Python, Django, dll. Sebagai bagian dari proses instalasi kami memungkinkan Anda untuk memilih basis data yang ingin Anda gunakan (MySQL, SQLite, PostgreSQL). Kami menggunakan installer secara ekstensif ketika mengotomatiskan penyebaran secara internal (mereka dapat dijalankan dalam mode tanpa pengawasan).

2
Josue

Saya memiliki file settings.py saya di direktori eksternal. Dengan begitu, itu tidak diperiksa ke kontrol sumber, atau ditulis secara berlebihan oleh sebuah penyebaran. Saya meletakkan ini di file settings.py di bawah proyek Django saya, bersama dengan pengaturan default:

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

Catatan: Ini sangat berbahaya jika Anda tidak dapat mempercayai local_settings.py.  

1
Chase Seibert

Yah, saya menggunakan konfigurasi ini:

Di akhir settings.py:

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

Dan di locale_settings.py:

#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

Selain beberapa file pengaturan yang disebutkan oleh Jim, saya juga cenderung menempatkan dua pengaturan ke dalam file settings.py saya di bagian atas BASE_DIR dan BASE_URL diatur ke jalur kode dan URL ke pangkalan situs, semua pengaturan lainnya dimodifikasi untuk menambahkan diri ke ini.

BASE_DIR = "/home/sean/myapp/" mis. MEDIA_ROOT = "%smedia/" % BASEDIR

Jadi saat memindahkan proyek saya hanya perlu mengedit pengaturan ini dan tidak mencari seluruh file.

Saya juga akan merekomendasikan melihat kain dan Capistrano (alat Ruby, tetapi dapat digunakan untuk menyebarkan aplikasi Django) yang memfasilitasi otomatisasi penyebaran jarak jauh.

1
Sean O Donnell

Ini adalah posting yang lebih lama tapi saya pikir jika saya menambahkan library yang bermanfaat ini akan menyederhanakan banyak hal.

Gunakan Django-konfigurasi

Mulai cepat

pip install Django-configurations

Kemudian subkelas konfigurasi yang disertakan. Kelas konfigurasi dalam pengaturan proyek Anda .py atau modul lain yang Anda gunakan untuk menyimpan konstanta pengaturan, mis .: .:

# mysite/settings.py

from configurations import Configuration

class Dev(Configuration):
    DEBUG = True

Setel variabel lingkungan Django_CONFIGURATION ke nama kelas yang baru saja Anda buat, mis. di ~/.bashrc:

export Django_CONFIGURATION=Dev

dan variabel lingkungan Django_SETTINGS_MODULE ke jalur impor modul seperti biasa, mis. dalam bash:

export Django_SETTINGS_MODULE=mysite.settings

Atau menyediakan opsi --configuration saat menggunakan perintah manajemen Django di sepanjang baris opsi baris perintah default --settings Django, misalnya:

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

Untuk mengaktifkan Django untuk menggunakan konfigurasi Anda, Anda sekarang harus memodifikasi skrip manage.py atau wsgi.py untuk menggunakan versi konfigurasi-Django dari konfigurasi fungsi starter yang sesuai, mis. a manage.py khas yang menggunakan konfigurasi Django akan terlihat seperti ini:

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

Perhatikan pada baris 10 kita tidak menggunakan alat umum Django.core.management.execute_from_command_line melainkan configurations.management.execute_from_command_line.

Hal yang sama berlaku untuk file wsgi.py Anda, mis .: .:

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

Di sini kita tidak menggunakan fungsi Django.core.wsgi.get_wsgi_application default melainkan configurations.wsgi.get_wsgi_application.

Itu dia! Anda sekarang dapat menggunakan proyek Anda dengan manage.py dan server berkemampuan WSGI favorit Anda.

0
Little Phild

Saya pikir itu tergantung pada ukuran situs, apakah Anda perlu melangkah keluar dari menggunakan SQLite, saya telah berhasil menggunakan SQLite pada beberapa situs hidup yang lebih kecil dan ini berjalan dengan baik.

0
Ycros

Saya menggunakan lingkungan:

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

Saya percaya ini adalah pendekatan yang jauh lebih baik, karena pada akhirnya Anda memerlukan pengaturan khusus untuk lingkungan pengujian Anda, dan Anda dapat dengan mudah menambahkannya ke kondisi ini.

0
slashmili

Begitu banyak jawaban yang rumit!

Setiap file settings.py dilengkapi dengan:

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

Saya menggunakan direktori itu untuk mengatur variabel DEBUG seperti ini (ganti dengan directoy di mana kode dev Anda berada):

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

Kemudian, setiap kali file settings.py dipindahkan, DEBUG akan Salah dan itu adalah lingkungan produksi Anda.

Setiap kali Anda membutuhkan pengaturan yang berbeda dari yang ada di lingkungan dev Anda cukup gunakan:

if(DEBUG):
    #Debug setting
else:
    #Release setting
0
JM Desrosiers