Apa cara yang disarankan untuk menangani pengaturan untuk pengembangan lokal dan server produksi? Beberapa dari mereka (seperti konstanta, dll) dapat diubah / diakses di keduanya, tetapi beberapa dari mereka (seperti path ke file statis) harus tetap berbeda, dan karenanya tidak boleh ditimpa setiap kali kode baru digunakan.
Saat ini, saya menambahkan semua konstanta ke settings.py
. Tetapi setiap kali saya mengubah konstanta secara lokal, saya harus menyalinnya ke server produksi dan mengedit file untuk perubahan spesifik produksi ... :(
Sunting: sepertinya tidak ada jawaban standar untuk pertanyaan ini, saya telah menerima metode yang paling populer.
python
django
deployment
akv
sumber
sumber
Jawaban:
Dalam
settings.py
:Anda dapat mengganti apa yang dibutuhkan di
local_settings.py
; itu harus tetap di luar kendali versi Anda kemudian. Tapi karena Anda menyebutkan menyalin, saya kira Anda tidak menggunakannya;)sumber
settings_local
daripadalocal_settings
mengelompokkannyasettings.py
dalam daftar folder alfabet. Jauhkansettings_local.py
dari kontrol versi menggunakan.gitignore
karena kredensial bukan milik Git. Bayangkan open source mereka secara tidak sengaja. Saya menyimpan git file template yang disebutsettings_local.py.txt
sebagai gantinya.Dua sendok Django: Praktik Terbaik untuk Django 1.5 menyarankan menggunakan kontrol versi untuk file pengaturan Anda dan menyimpan file dalam direktori terpisah:
The
base.py
file berisi pengaturan umum (seperti MEDIA_ROOT atau ADMIN), sementaralocal.py
danproduction.py
memiliki pengaturan spesifik:Dalam file dasar
settings/base.py
:Dalam file pengaturan pengembangan lokal
settings/local.py
:Dalam file pengaturan produksi file
settings/production.py
:Kemudian ketika Anda menjalankan Django, Anda menambahkan
--settings
opsi:Para penulis buku juga telah memasang contoh template tata letak proyek di Github.
sumber
--settings
setiap waktu, Anda dapat mengaturDJANGO_SETTINGS_MODULE
envvar. Ini berfungsi baik dengan, misalnya, Heroku: mengaturnya secara global untuk produksi, lalu menimpanya dengan dev di file .env Anda.DJANGO_SETTINGS_MODULE
env var adalah ide terbaik di sini, terima kasih Simon.BASE_DIR
pengaturan keos.path.dirname(os.path.realpath(os.path.dirname(__file__) + "/.."))
from django.conf import settings
yang merupakan objek yang abstrak antarmuka dan memisahkan kode dari lokasi pengaturan, docs.djangoproject.com/en/dev/topics/settings/…Alih-alih
settings.py
, gunakan tata letak ini:common.py
adalah tempat sebagian besar konfigurasi Anda.prod.py
mengimpor semuanya dari yang umum, dan menimpa apa pun yang perlu ditimpa:Demikian pula,
dev.py
mengimpor segala sesuatu daricommon.py
dan menimpa apa pun yang perlu ditimpa.Terakhir,
__init__.py
adalah tempat Anda memutuskan pengaturan mana yang akan dimuat, dan itu juga tempat Anda menyimpan rahasia (karena itu file ini tidak boleh diversi):Apa yang saya sukai dari solusi ini adalah:
common.py
.prod.py
, hal-hal khusus dev masukdev.py
. Itu mudah.common.py
dalamprod.py
ataudev.py
, dan Anda dapat menimpa apa pun di__init__.py
.sumber
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "foobar.settings")
foobar adalah folder dengan__init__.py
file dan pengaturan adalah folder dengan__init__.py
file yang berisi rahasia saya dan impor dev.py, yang kemudian mengimpor common.py. EDIT Nevermind, saya tidak memiliki modul yang diinstal yang diperlukan. Salahku! Ini sangat bagus !!Saya menggunakan versi sedikit modifikasi dari gaya "jika DEBUG" pengaturan yang diposting Harper Shelby. Jelas tergantung pada lingkungan (win / linux / dll.) Kode mungkin perlu sedikit di-tweak.
Saya dulu menggunakan "jika DEBUG" tetapi saya menemukan bahwa kadang-kadang saya perlu melakukan pengujian dengan DEUBG diatur ke False. Apa yang benar-benar ingin saya bedakan jika lingkungannya adalah produksi atau pengembangan, yang memberi saya kebebasan untuk memilih level DEBUG.
Saya masih menganggap cara pengaturan ini sedang berjalan. Saya belum melihat satu cara untuk menangani pengaturan Django yang mencakup semua pangkalan dan pada saat yang sama tidak merepotkan total untuk setup (saya tidak kecewa dengan metode file pengaturan 5x).
sumber
os.environ['COMPUTERNAME']
sayangnya tidak berfungsi di PythonAnywhere. Anda mendapatkan KeyError.Saya menggunakan settings_local.py dan a settings_production.py. Setelah mencoba beberapa opsi, saya menemukan bahwa membuang-buang waktu dengan solusi yang kompleks menjadi mudah ketika memiliki dua file pengaturan terasa mudah dan cepat.
Ketika Anda menggunakan mod_python / mod_wsgi untuk proyek Django Anda, Anda perlu mengarahkannya ke file pengaturan Anda. Jika Anda mengarahkannya ke app / settings_local.py di server lokal Anda dan app / settings_production.py di server produksi Anda maka hidup menjadi mudah. Cukup edit file pengaturan yang sesuai dan mulai ulang server (server pengembangan Django akan memulai ulang secara otomatis).
sumber
python manage.py runserver
), file pengaturan mana yang digunakan?TL; DR: Kuncinya adalah memodifikasi
os.environment
sebelum Anda mengimporsettings/base.py
apa punsettings/<purpose>.py
, ini akan sangat menyederhanakan hal-hal.Hanya memikirkan semua file yang saling terkait ini membuat saya sakit kepala. Menggabungkan, mengimpor (kadang-kadang kondisional), mengesampingkan, menambal apa yang sudah diatur dalam
DEBUG
pengaturan kasus berubah nanti. Sungguh mimpi buruk!Selama bertahun-tahun saya mengalami semua solusi yang berbeda. Mereka semua agak pekerjaan, tapi begitu menyakitkan untuk mengelola. WTF! Apakah kita benar-benar membutuhkan semua kerumitan itu? Kami mulai dengan hanya satu
settings.py
file. Sekarang kita membutuhkan dokumentasi hanya untuk menggabungkan semua ini dengan benar dalam urutan yang benar!Saya harap saya akhirnya mencapai sweet spot (saya) dengan solusi di bawah ini.
Mari kita rekap tujuan (beberapa umum, beberapa milikku)
Jaga kerahasiaan rahasia - jangan menyimpannya di repo!
Atur / baca kunci dan rahasia melalui pengaturan lingkungan, gaya 12 faktor .
Memiliki default fallback yang masuk akal. Idealnya untuk pengembangan lokal Anda tidak perlu apa-apa selain standar.
... tetapi cobalah untuk menjaga produksi default tetap aman. Lebih baik melewatkan pengaturan yang ditimpa secara lokal, daripada harus mengingat untuk menyesuaikan pengaturan default yang aman untuk produksi.
Memiliki kemampuan untuk menghidupkan
DEBUG
/ mematikan dengan cara yang dapat memiliki efek pada pengaturan lain (mis. Menggunakan javascript terkompresi atau tidak).Beralih antara pengaturan tujuan, seperti lokal / pengujian / pementasan / produksi, harus didasarkan hanya pada
DJANGO_SETTINGS_MODULE
, tidak lebih.... tetapi memungkinkan parameterisasi lebih lanjut melalui pengaturan lingkungan seperti
DATABASE_URL
.... juga memungkinkan mereka untuk menggunakan pengaturan tujuan yang berbeda dan menjalankannya secara lokal berdampingan, misalnya. pengaturan produksi pada mesin pengembang lokal, untuk mengakses basis data produksi atau menguji style sheet uji asap.
Gagal jika variabel lingkungan tidak ditetapkan secara eksplisit (membutuhkan nilai kosong minimum), terutama dalam produksi, misalnya.
EMAIL_HOST_PASSWORD
.Menanggapi pengaturan default
DJANGO_SETTINGS_MODULE
di manage.py selama django-admin startprojectJauhkan conditional untuk minimum, jika kondisi yang jenis lingkungan bertujuan (misalnya. Untuk produksi set file log dan rotasi itu), menggantikan pengaturan dalam terkait pengaturan file bertujuan.
Jangan lakukan itu
Jangan biarkan Django membaca pengaturan DJANGO_SETTINGS_MODULE membentuk file.
Ugh! Pikirkan bagaimana meta ini. Jika Anda perlu memiliki file (seperti docker env) baca itu ke lingkungan sebelum menatap proses Django.
Jangan menimpa DJANGO_SETTINGS_MODULE dalam kode proyek / aplikasi Anda, mis. berdasarkan nama host atau nama proses.
Jika Anda malas untuk mengatur variabel lingkungan (seperti untuk
setup.py test
) lakukan di tooling sebelum Anda menjalankan kode proyek Anda.Hindari sihir dan menambal tentang bagaimana Django membaca pengaturan itu, preprocess pengaturan tetapi tidak mengganggu sesudahnya.
Tidak ada omong kosong berbasis logika yang rumit. Konfigurasi harus diperbaiki dan terwujud tidak dihitung dengan cepat. Memberikan default mundur adalah logika yang cukup di sini.
Apakah Anda benar-benar ingin melakukan debug, mengapa secara lokal Anda memiliki set pengaturan yang benar tetapi dalam produksi pada server jauh, pada satu dari seratus mesin, sesuatu dikomputasi secara berbeda? Oh! Tes unit? Untuk pengaturan? Serius?
Larutan
Strategi saya terdiri dari django-environment luar biasa yang digunakan dengan
ini
file gaya, memberikanos.environment
standar untuk pengembangan lokal, beberapasettings/<purpose>.py
file minimal dan pendek yang memilikiimport settings/base.py
SETELAH yangos.environment
ditetapkan dariINI
file. Ini secara efektif memberi kita semacam pengaturan injeksi.Kuncinya di sini adalah memodifikasi
os.environment
sebelum Anda mengimporsettings/base.py
.Untuk melihat contoh lengkapnya, lakukan repo: https://github.com/wooyek/django-settings-strategy
pengaturan / .env
Default untuk pengembangan lokal. File rahasia, sebagian besar untuk mengatur variabel lingkungan yang diperlukan. Tetapkan nilai kosong jika tidak diperlukan dalam pengembangan lokal. Kami memberikan standar di sini dan tidak
settings/base.py
gagal pada mesin lain jika mereka hilang dari lingkungan.pengaturan / local.py
Apa yang terjadi di sini, adalah memuat lingkungan dari
settings/.env
, lalu mengimpor pengaturan umum darisettings/base.py
. Setelah itu kita dapat mengganti beberapa untuk memudahkan pembangunan lokal.pengaturan / production.py
Untuk produksi, kita seharusnya tidak mengharapkan file lingkungan, tetapi lebih mudah memilikinya jika kita menguji sesuatu. Tapi bagaimanapun, jangan sampai memberikan beberapa default inline, sehingga
settings/base.py
dapat merespons sesuai.Poin utama yang menarik di sini adalah
DEBUG
danASSETS_DEBUG
menimpa, mereka akan diterapkan pada pythonos.environ
SAJA jika mereka HILANG dari lingkungan dan file.Ini akan menjadi default produksi kami, tidak perlu menempatkannya di lingkungan atau file, tetapi mereka dapat diganti jika diperlukan. Rapi!
pengaturan / base.py
Ini sebagian besar pengaturan vanilla django Anda, dengan beberapa persyaratan dan banyak membacanya dari lingkungan. Hampir semuanya ada di sini, menjaga semua lingkungan yang dituju konsisten dan semirip mungkin.
Perbedaan utama di bawah ini (saya harap ini cukup jelas):
Bit terakhir menunjukkan kekuatan di sini.
ASSETS_DEBUG
memiliki default yang masuk akal, yang dapat ditimpasettings/production.py
dan bahkan yang dapat ditimpa oleh pengaturan lingkungan! Yay!Akibatnya, kami memiliki hierarki kepentingan campuran:
sumber
Saya mengelola konfigurasi saya dengan bantuan pengaturan-split-Django .
Ini adalah pengganti drop-in untuk pengaturan default. Ini sederhana, namun dapat dikonfigurasi. Dan refactoring dari pengaturan Anda yang ada tidak diperlukan.
Berikut ini contoh kecil (file
example/settings/__init__.py
):Itu dia.
Memperbarui
Saya menulis posting blog tentang mengelola
django
pengaturan dengandjango-split-sttings
. Silahkan lihat!sumber
uwsgi.ini
file saya memiliki pengaturan berbeda di dev / prod .. ada ide bagaimana membuatnya mengambil nilai dari file pengaturan saya?Masalah dengan sebagian besar solusi ini adalah Anda menerapkan pengaturan lokal sebelum yang umum, atau setelahnya .
Jadi tidak mungkin menimpa hal-hal seperti
pada waktu bersamaan.
Salah satu solusi dapat diimplementasikan menggunakan file konfigurasi gaya "ini" dengan kelas ConfigParser. Ini mendukung banyak file, interpolasi string malas, nilai default dan banyak barang lainnya. Setelah sejumlah file dimuat, lebih banyak file dapat dimuat dan nilainya akan menimpa yang sebelumnya, jika ada.
Anda memuat satu atau lebih file konfigurasi, tergantung pada alamat mesin, variabel lingkungan dan bahkan nilai dalam file konfigurasi yang dimuat sebelumnya. Kemudian Anda hanya menggunakan nilai yang diurai untuk mengisi pengaturan.
Salah satu strategi yang berhasil saya gunakan adalah:
defaults.ini
file defaultnet.ini
, lalunet.domain.ini
, kemudiannet.domain.webserver01.ini
, masing-masing mungkin mengesampingkan nilai-nilai sebelumnya). Akun ini juga untuk mesin pengembang, sehingga masing-masing dapat mengatur driver basis data yang disukai, dll untuk pengembangan lokalcluster.cluster_name.ini
, yang dapat menentukan hal-hal seperti basis data dan IP cacheSebagai contoh dari sesuatu yang dapat Anda capai dengan ini, Anda dapat mendefinisikan nilai "subdomain" per-env, yang kemudian digunakan dalam pengaturan default (as
hostname: %(subdomain).whatever.net
) untuk mendefinisikan semua nama host dan cookie yang diperlukan hal-hal yang perlu dilakukan oleh Django.Ini seperti KERING yang bisa saya dapatkan, kebanyakan file (yang sudah ada) hanya memiliki 3 atau 4 pengaturan. Selain itu, saya harus mengelola konfigurasi pelanggan, jadi ada satu set file konfigurasi tambahan (dengan hal-hal seperti nama basis data, pengguna dan kata sandi, subdomain yang ditugaskan, dll.) Ada, satu atau lebih per pelanggan.
Satu dapat mengatur skala ini sebagai rendah atau setinggi yang diperlukan, Anda hanya memasukkan file konfigurasi kunci yang ingin Anda konfigurasi per-lingkungan, dan begitu ada kebutuhan untuk konfigurasi baru, masukkan nilai sebelumnya dalam konfigurasi default, dan menimpanya jika perlu.
Sistem ini telah terbukti andal dan berfungsi baik dengan kontrol versi. Ini telah digunakan untuk waktu yang lama mengelola dua kelompok aplikasi yang terpisah (15 contoh situs django atau lebih yang terpisah per mesin), dengan lebih dari 50 pelanggan, di mana kelompok-kelompok itu berubah ukuran dan anggota tergantung pada suasana sysadmin. .
sumber
config = ConfigParser.ConfigParser()
lalu membaca file Andaconfig.read(array_of_filenames)
dan mendapatkan nilai menggunakanconfig.get(section, option)
. Jadi pertama-tama Anda memuat konfigurasi Anda, dan kemudian Anda menggunakannya untuk membaca nilai pengaturan.Saya juga bekerja dengan Laravel dan saya suka implementasinya di sana. Saya mencoba meniru dan menggabungkannya dengan solusi yang diajukan oleh T. Stone (lihat di atas):
Mungkin sesuatu seperti ini akan membantu Anda.
sumber
Ingat bahwa settings.py adalah file kode langsung. Dengan asumsi bahwa Anda tidak memiliki DEBUG ditetapkan pada produksi (yang merupakan praktik terbaik), Anda dapat melakukan sesuatu seperti:
Cukup mendasar, tetapi secara teori, Anda bisa naik ke tingkat kompleksitas apa pun hanya berdasarkan nilai DEBUG - atau variabel atau kode lain yang ingin Anda gunakan.
sumber
Untuk sebagian besar proyek saya, saya menggunakan pola berikut:
from settings_base import *
)(Untuk menjalankan manage.py dengan pengaturan kustom file yang Anda hanya menggunakan opsi perintah --settings:
manage.py <command> --settings=settings_you_wish_to_use.py
)sumber
Solusi saya untuk masalah itu juga agak campuran dari beberapa solusi yang telah dinyatakan di sini:
local_settings.py
yang memiliki kontenUSING_LOCAL = True
di dev danUSING_LOCAL = False
di prodsettings.py
saya lakukan impor pada file itu untuk mendapatkanUSING_LOCAL
pengaturanSaya kemudian mendasarkan semua pengaturan yang bergantung pada lingkungan saya pada yang itu:
Saya lebih suka ini memiliki dua file settings.py terpisah yang perlu saya pertahankan karena saya dapat membuat pengaturan saya terstruktur dalam satu file lebih mudah daripada memiliki mereka menyebar di beberapa file. Seperti ini, ketika saya memperbarui pengaturan saya tidak lupa melakukannya untuk kedua lingkungan.
Tentu saja setiap metode memiliki kekurangan dan yang satu ini tidak terkecuali. Masalahnya di sini adalah bahwa saya tidak bisa menimpa
local_settings.py
file setiap kali saya mendorong perubahan saya menjadi produksi, yang berarti saya tidak bisa hanya menyalin semua file secara membabi buta, tetapi itu adalah sesuatu yang bisa saya jalani.sumber
Saya menggunakan variasi dari apa yang disebutkan jpartogi di atas, yang saya temukan sedikit lebih pendek:
Pada dasarnya di setiap komputer (pengembangan atau produksi) saya memiliki file hostname_settings.py yang sesuai yang akan dimuat secara dinamis.
sumber
Ada juga Pengaturan Classy Django. Saya pribadi penggemar beratnya. Ini dibangun oleh salah satu orang paling aktif di Django IRC. Anda akan menggunakan vars lingkungan untuk mengatur hal-hal.
http://django-classy-settings.readthedocs.io/en/latest/
sumber
1 - Buat folder baru di dalam aplikasi Anda dan pengaturan nama untuk itu.
2 - Sekarang buat
__init__.py
file baru di dalamnya dan tulis di dalamnya3 - Buat tiga file baru dalam nama folder pengaturan
local.py
danproduction.py
danbase.py
.4 - Di dalam
base.py
, salin semua kontensettings.py
folder sebelumnya dan ganti namanya dengan sesuatu yang berbeda, katakanlahold_settings.py
.5 - Di base.py ubah jalur BASE_DIR Anda untuk mengarahkan ke jalur pengaturan baru Anda
Jalan lama->
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Jalur baru ->
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
Dengan cara ini, dir proyek dapat terstruktur dan dapat dikelola di antara produksi dan pengembangan lokal.
sumber
Untuk menggunakan
settings
konfigurasi yang berbeda pada lingkungan yang berbeda, buat file pengaturan yang berbeda. Dan dalam skrip penerapan Anda, mulai server menggunakan--settings=<my-settings.py>
parameter, di mana Anda dapat menggunakan pengaturan berbeda di lingkungan yang berbeda.Manfaat menggunakan pendekatan ini :
Pengaturan Anda akan modular berdasarkan pada setiap lingkungan
Anda dapat mengimpor yang
master_settings.py
berisi konfigurasi basis dienvironmnet_configuration.py
dan menimpa nilai yang ingin Anda ubah di lingkungan itu.Jika Anda memiliki tim yang sangat besar, setiap pengembang dapat memiliki timnya sendiri
local_settings.py
yang dapat mereka tambahkan ke repositori kode tanpa risiko memodifikasi konfigurasi server. Anda dapat menambahkan pengaturan lokal ini ke.gitnore
jika Anda menggunakan git atau.hginore
jika Anda Mercurial untuk Kontrol Versi (atau yang lain). Dengan begitu pengaturan lokal bahkan tidak akan menjadi bagian dari basis kode aktual yang menjaganya tetap bersih.sumber
Pengaturan saya terpecah sebagai berikut
Kami memiliki 3 lingkungan
Sekarang jelas pementasan dan produksi harus memiliki lingkungan serupa yang semaksimal mungkin. Jadi kami menyimpan
prod.py
keduanya.Tetapi ada kasus di mana saya harus mengidentifikasi server yang sedang berjalan adalah server produksi. @T. Jawaban Stone membantu saya menulis cek sebagai berikut.
sumber
Saya membedakannya di manage.py dan membuat dua file pengaturan terpisah: local_settings.py dan prod_settings.py.
Di manage.py saya memeriksa apakah servernya adalah server lokal atau server produksi. Jika ini adalah server lokal, ia akan memuat local_settings.py dan itu adalah server produksi, ia akan memuat prod_settings.py. Pada dasarnya ini akan terlihat seperti:
Saya menemukan lebih mudah untuk memisahkan file pengaturan menjadi dua file terpisah daripada melakukan banyak seandainya di dalam file pengaturan.
sumber
Sebagai alternatif untuk mempertahankan file yang berbeda jika Anda mau: Jika Anda menggunakan git atau VCS lainnya untuk mendorong kode dari lokal ke server, yang dapat Anda lakukan adalah menambahkan file pengaturan ke .gitignore.
Ini akan memungkinkan Anda untuk memiliki konten yang berbeda di kedua tempat tanpa masalah. SO pada server, Anda dapat mengonfigurasi versi setting.py independen dan perubahan apa pun yang dibuat pada lokal tidak akan tercermin di server dan sebaliknya.
Selain itu, ia akan menghapus file settings.py dari github juga, kesalahan besar, yang telah saya lihat banyak pemula lakukan.
sumber
Membuat beberapa versi pengaturan.py adalah pola anti untuk metodologi 12 Factor App . gunakan python-decouple atau django -viron sebagai gantinya.
sumber
Saya pikir solusi terbaik disarankan oleh @T. Stone, tapi aku tidak tahu mengapa tidak menggunakan bendera DEBUG di Django. Saya Tulis kode di bawah ini untuk situs web saya:
Selalu solusi sederhana lebih baik daripada solusi yang kompleks.
sumber
Saya menemukan tanggapan di sini sangat membantu. (Apakah ini telah diselesaikan secara lebih definitif? Tanggapan terakhir adalah setahun yang lalu.) Setelah mempertimbangkan semua pendekatan yang terdaftar, saya datang dengan solusi yang saya tidak lihat tercantum di sini.
Kriteria saya adalah:
Saya pikir menyalakan mesin host masuk akal, tetapi kemudian menemukan masalah sebenarnya di sini adalah pengaturan yang berbeda untuk lingkungan yang berbeda , dan memiliki momen aha. Saya meletakkan kode ini di akhir file settings.py saya:
Dengan cara ini, aplikasi secara default ke pengaturan produksi, yang berarti Anda secara eksplisit "memasukkan" lingkungan pengembangan Anda. Jauh lebih aman untuk lupa mengatur variabel lingkungan secara lokal daripada jika itu sebaliknya dan Anda lupa untuk mengatur sesuatu dalam produksi dan membiarkan beberapa pengaturan dev digunakan.
Saat berkembang secara lokal, baik dari shell atau di .bash_profile atau di mana pun:
(Atau jika Anda mengembangkan pada Windows, atur melalui Control Panel atau apa pun namanya hari ini ... Windows selalu membuatnya begitu tidak jelas sehingga Anda dapat mengatur variabel lingkungan.)
Dengan pendekatan ini, pengaturan dev semua berada di satu tempat (standar), dan cukup mengesampingkan yang produksi di mana diperlukan. Setiap penyia-nyiaan dengan pengaturan pengembangan harus benar-benar aman untuk berkomitmen pada kontrol sumber tanpa dampak pada produksi.
sumber