Saya telah mengembangkan aplikasi dasar. Sekarang pada tahap penerapan, menjadi jelas bahwa saya membutuhkan pengaturan lokal dan pengaturan produksi.
Akan sangat menyenangkan mengetahui hal-hal berikut:
- Cara terbaik menangani pengaturan pengembangan dan produksi.
- Bagaimana menyimpan aplikasi seperti django-debug-toolbar hanya di lingkungan pengembangan.
- Kiat dan praktik terbaik lainnya untuk pengaturan pengembangan dan penerapan.
Jawaban:
The
DJANGO_SETTINGS_MODULE
variabel lingkungan kontrol yang pengaturan file Django akan memuat.Oleh karena itu, Anda membuat file konfigurasi terpisah untuk lingkungan Anda masing-masing (perhatikan bahwa file tersebut tentu saja dapat dari
import *
file "pengaturan bersama" yang terpisah), dan digunakanDJANGO_SETTINGS_MODULE
untuk mengontrol mana yang akan digunakan.Begini caranya:
Seperti dicatat dalam dokumentasi Django:
Jadi, anggaplah Anda membuat
myapp/production_settings.py
danmyapp/test_settings.py
di repositori sumber Anda.Dalam hal ini, Anda masing-masing akan mengatur
DJANGO_SETTINGS_MODULE=myapp.production_settings
untuk menggunakan yang pertama danDJANGO_SETTINGS_MODULE=myapp.test_settings
yang terakhir.Mulai saat ini, masalahnya bermuara pada pengaturan
DJANGO_SETTINGS_MODULE
variabel lingkungan.Setting
DJANGO_SETTINGS_MODULE
menggunakan script atau shellAnda kemudian dapat menggunakan script bootstrap atau manajer proses untuk memuat pengaturan yang benar (dengan menetapkan lingkungan), atau hanya menjalankannya dari shell Anda sebelum memulai Django:
export DJANGO_SETTINGS_MODULE=myapp.production_settings
.Perhatikan bahwa Anda dapat menjalankan ekspor ini kapan saja dari shell - tidak perlu berada di Anda
.bashrc
atau apa pun.Pengaturan
DJANGO_SETTINGS_MODULE
menggunakan Manajer ProsesJika Anda tidak suka menulis skrip bootstrap yang mengatur lingkungan (dan ada alasan bagus untuk merasa seperti itu!), Saya akan merekomendasikan menggunakan manajer proses:
environment
..env
) .Terakhir, perhatikan bahwa Anda dapat memanfaatkan
PYTHONPATH
variabel untuk menyimpan pengaturan di lokasi yang sama sekali berbeda (mis. Di server produksi, menyimpannya di/etc/
). Ini memungkinkan untuk memisahkan konfigurasi dari file aplikasi. Anda mungkin menginginkannya atau tidak, itu tergantung pada bagaimana aplikasi Anda terstruktur.sumber
settings.py
file tersebut disimpanSiteName/settings.py
secara default, jika Anda menempatkan file pengaturan alternatif Anda di direktori yang sama, baris yang ditambahkan ke bin / aktifkan akan membacaDJANGO_SETTINGS_MODULE="SiteName.test_settings"
Jika tidak, jawaban yang sangat baik!DJANGO_SETTINGS_MODULE
untuk memilih yang ingin Anda gunakan. Memodifikasibin/activate
adalah salah satu untuk melakukan yang terakhir (TBH, saya tidak lagi berpikir ini adalah ide yang bagus, jadi saya mengeluarkannya), tetapi itu bukan satu-satunya.Secara default gunakan pengaturan produksi, tetapi buat file yang disebut
settings_dev.py
dalam folder yang sama dengansettings.py
file Anda . Tambahkan penggantian di sana, sepertiDEBUG=True
.Di komputer yang akan digunakan untuk pengembangan, tambahkan ini ke
~/.bashrc
file Anda :Di bagian bawah
settings.py
file Anda , tambahkan yang berikut ini.(Perhatikan bahwa mengimpor
*
umumnya harus dihindari dengan Python)Secara default, server produksi tidak akan menimpa apa pun. Selesai!
Dibandingkan dengan jawaban lainnya, yang satu ini lebih sederhana karena tidak memerlukan pemutakhiran
PYTHONPATH
, atau pengaturanDJANGO_SETTINGS_MODULE
yang hanya memungkinkan Anda untuk bekerja pada satu proyek django dalam satu waktu.sumber
if os.environ.get('DJANGO_DEVELOPMENT', 'true')
juga bekerja. Saya menyebutkan ini hanya karenais not true
metode di atas gagal mengimpor untuk saya pada Python 3.6.DEV
pengaturan Anda yang akan membocorkan data pribadi di server publik. Anda benar-benar hanya ingin memeriksa apakahDJANGO_DEVELOPMENT
variabel lingkungan ada (yaituis not None
).settings_dev.py
memuat di server.is not None
cek. Jugaos.getenv
merupakan singkatanSaya biasanya memiliki satu file pengaturan per lingkungan, dan file pengaturan bersama:
Setiap file lingkungan saya memiliki:
Ini memungkinkan saya untuk mengganti pengaturan bersama jika perlu (dengan menambahkan modifikasi di bawah bait itu).
Saya kemudian memilih file pengaturan mana yang akan digunakan dengan menghubungkannya ke settings.py:
sumber
import *
? Apakah Anda menonaktifkan pemeriksaan itu? Saya telah membungkus impor iniexec()
tetapi kemudian saya tidak dapat memiliki persyaratan pada variabel yang tidak ditentukan dalam file ini, saya juga tidak dapat mengubahINSTALLED_APPS
variabel karena "tidak ditentukan"Ini adalah bagaimana saya melakukannya dalam 6 langkah mudah:
Buat folder di dalam direktori proyek Anda dan beri nama
settings
.Struktur proyek:
Buat empat file python bagian dalam
settings
direktori yaitu__init__.py
,base.py
,dev.py
danprod.py
File pengaturan:
Buka
__init__.py
dan isi dengan konten berikut:init .py:
Buka
base.py
dan isi dengan semua pengaturan umum (yang akan digunakan baik dalam produksi maupun pengembangan.) Misalnya:base.py:
Buka
dev.py
dan sertakan hal-hal yang khusus untuk pengembangan misalnya:dev.py:
Buka
prod.py
dan sertakan hal-hal yang khusus produksi misalnya:prod.py:
sumber
Buat banyak
settings*.py
file, ekstrapolasi variabel yang perlu diubah per lingkungan. Kemudian di akhirsettings.py
file master Anda :Anda menyimpan
settings_*
file terpisah untuk setiap tahap.Di bagian atas
settings_dev.py
file Anda , tambahkan ini:Untuk mengimpor variabel yang perlu Anda ubah.
Entri wiki ini memiliki lebih banyak ide tentang cara membagi pengaturan Anda.
sumber
settings_prod.py
modname = "%s.settings" % ".".join(__name__.split('.')[:-1])
untuk mendapatkan nama modul lengkap dan kemudianglobals().update(vars(sys.modules[modname]))
. Saya menemukan itu bekerja dengan baik untuk saya. Tentu saja mengabaikan sedikit tentang secara programatik menentukan nama modul yang mendukung string mungkin akan berfungsi dalam banyak kasus juga.Saya menggunakan konfigurasi-django yang mengagumkan , dan semua pengaturan disimpan di
settings.py
:Untuk mengkonfigurasi proyek Django saya hanya mengikuti dokumen .
sumber
Inilah pendekatan yang kami gunakan:
settings
modul untuk pengaturan dibagi menjadi beberapa file untuk dibaca;.env.json
file toko kredensial dan parameter yang kita ingin dikecualikan dari repositori git kami, atau yang spesifik lingkungan;env.py
berkas untuk membaca.env.json
berkasMempertimbangkan struktur berikut:
Dengan
.env.json
suka:Dan
project_name/env.py
:Kami dapat memiliki pengaturan berikut:
manfaat dari solusi ini adalah:
.env.json
seperti dev, stagging dan produksi;Saya harap ini membantu, beri tahu saya jika Anda melihat peringatan dengan solusi ini.
sumber
env
harus menggantidev
,prod
dll? Apa yang ada disettings.py
file lama ? Ada apastorage.py
dandatabase.py
?env.py
file sehingga Anda dapat memilih, dengan variabel lingkungan, file mana yang akan dimuatSaya menggunakan struktur file folloring:
Begitu
__init__.py
juga dengan link (ln di unix atau mklink di windows) kelocal.py
atau bisa jugaprod.py
agar konfigurasi diproject.settings
modul masih bersih dan teratur, dan jika ingin menggunakan konfigurasi tertentu anda bisa menggunakan variabel environmentDJANGO_SETTINGS_MODULE
untukproject.settings.prod
jika perlu untuk menjalankan perintah untuk lingkungan produksi.Di file
prod.py
danlocal.py
:dan
shared.py
file tersebut tetap global tanpa konfigurasi khusus.sumber
membangun jawaban cs01:
jika Anda mengalami masalah dengan variabel lingkungan, tetapkan nilainya ke string (misalnya saya lakukan
DJANGO_DEVELOPMENT="true"
).Saya juga mengubah alur kerja file cs01 sebagai berikut:
Dengan cara ini, Django tidak harus membaca keseluruhan berkas pengaturan sebelum menjalankan berkas pengaturan yang sesuai. Solusi ini berguna jika file produksi Anda membutuhkan barang yang hanya ada di server produksi Anda.
Catatan: di Python 3, file yang diimpor perlu
.
ditambahkan (mis.from .settings_dev import *
)sumber
Jika Anda ingin menyimpan 1 file pengaturan, dan sistem operasi pengembangan Anda berbeda dari sistem operasi produksi Anda, Anda dapat meletakkan ini di bagian bawah settings.py:
Baca lebih lanjut: Bagaimana cara memeriksa sistem operasi dengan Python?
sumber
Ini sepertinya telah dijawab, namun metode yang saya gunakan sebagai kombinasi dengan kontrol versi adalah sebagai berikut:
Siapkan file env.py di direktori yang sama dengan pengaturan di lingkungan pengembangan lokal saya yang juga saya tambahkan ke .gitignore:
env.py:
.gitignore:
settings.py:
Saya baru saja menemukan ini berfungsi dan jauh lebih elegan - dengan env.py mudah untuk melihat variabel lingkungan lokal kita dan kita dapat menangani semua ini tanpa beberapa file settings.py atau sejenisnya. Metode ini memungkinkan semua jenis variabel lingkungan lokal untuk digunakan yang tidak ingin kita atur di server produksi kita. Memanfaatkan .gitignore melalui kontrol versi, kami juga menjaga agar semuanya tetap terintegrasi dengan mulus.
sumber
Config
kelas di dalamenv.py
file. Kemudian alih-alih sebuahimport *
, modul dapat diimpor olehfrom env import Config
. Dengan cara ini Anda juga tidak perlu menggunakan ifos.path
check yang membuat semuanya lebih sederhana.Gunakan
settings.py
untuk produksi. Di direktori yang sama buatsettings_dev.py
untuk menimpa.Pada mesin dev jalankan aplikasi Django Anda dengan:
Di mesin prod, jalankan seolah-olah Anda baru saja punya
settings.py
dan tidak ada yang lainKEUNTUNGAN
settings.py
(digunakan untuk produksi) benar-benar agnostik terhadap fakta bahwa lingkungan lain bahkan ada.settings_dev.py
. Tidak perlu mengumpulkan konfigurasi yang tersebar di seluruhsettings_prod.py
,settings_dev.py
dansettings_shared.py
.sumber
Untuk masalah pengaturan file, saya memilih untuk menyalin
Ketika Anda menjalankan django, __init__py akan dijalankan. Saat ini,
settings.py in setting1_dir
akan menggantikansettings.py in Project
.Bagaimana memilih env yang berbeda?
__init__.py
secara langsung.__init__.py
.__init__.py
membaca variabel ini.Mengapa menggunakan cara ini?
Karena saya tidak suka begitu banyak file dalam direktori yang sama, terlalu banyak file akan membingungkan mitra lain dan tidak terlalu baik untuk IDE. (IDE tidak dapat menemukan file apa yang kita gunakan)
Jika Anda tidak ingin melihat semua detail ini, Anda dapat membagi proyek menjadi dua bagian.
sumber
Saya menggunakan file app.yaml yang berbeda untuk mengubah konfigurasi antar lingkungan di mesin aplikasi cloud Google.
Anda dapat menggunakan ini untuk membuat koneksi proxy di perintah terminal Anda:
https://cloud.google.com/sql/docs/sqlserver/connect-admin-proxy#macos-64-bit
File: app.yaml
sumber
Ini adalah solusi saya, dengan lingkungan yang berbeda untuk dev, test dan prod
sumber