Django settings μ requirements
π»settings μ requirements νμΌ
μΈν κ°μ μ μ©μ μλ²λ₯Ό μ¬μμν΄μΌλ§ κ°λ₯νκΈ°λλ¬Έμ κ°λ°μλ€μ΄ μλΉμ€ μ΄μμ€μ μμλ‘ λ³κ²½ν μλ μλ€
π¬κΆμ₯νλ μ₯κ³ μ μ€μ λ°©λ²
- λ²μ 컨νΈλ‘€ μμ€ν μΌλ‘ λͺ¨λ μ€μ νμΌμ κ΄λ¦¬ν΄μΌνλ€ (νΉνλ μ΄μνκ²½μμ μ€μ) (μΈν λ³νμ λν κΈ°λ‘μ΄ λ°λμ λ¬Έμν λμ΄μΌ νλ€)
- λ°λ³΅λλ μ€μ λ€μ μμ μΌ νλ€ copy & paste λ₯Ό μ΄μ©νκΈ° 보λ€λ κΈ°λ³Έ νμΌλ‘ λΆν°μ μμμ μ΄μ©νλλ‘ νμ
- μνΈλ λΉλ°ν€ λ±μ μμ νκ² λ³΄κ΄
(보μμ λ―Όκ°ν λΆλΆμ λν΄μλ
gitignore
λ±μ μ΄μ©νμ¬ μ μΈ κ΄λ¦¬ ν΄μ€μΌ νλ€) μ¦SECRET_KEY
μΈν μ μ₯κ³ μ μνΈν μΈμ¦ κΈ°λ₯μ μ΄μ©λλλ° repoμμ μ μΈν΄μΌνλ€
π‘ λ²μ κ΄λ¦¬λμ§ μλ λ‘컬μΈν μ νΌνμ
local_setting.py
μΌλ‘ μΈν
μ νκ² λλ©΄ λͺ¨λ λ¨Έμ μ κΈ°λ‘λμ§μλ μ½λκ° μ‘΄μ¬νκ² λκ³
μ΄μνκ²½μ λ¬Έμ μ μ΄ λ‘컬νκ²½μμ ꡬνμ΄ μ λ μλ μμ λΏμλλΌ λ‘컬μ λ²κ·Έκ° local_setting.py
λͺ¨λμ μνκ²μΌμλ μλ€.
κ²λ€κ° local_setting.py
λ₯Ό νμλΌλ¦¬ 곡μ νκ² λλ©΄ copy& pasteλ₯Ό νκ² λλ μΌμ΄λ―λ‘ μ³μ§ λͺ»νλ€
π‘ μ¬λ¬κ°μ settings νμΌ μ΄μ©νκΈ°
νκ°μ setting.py
λ₯Ό μ΄μ©νκΈ° 보λ€
settings/
__init__.py
base.py # νλ‘μ νΈμ λͺ¨λ μΈμ€ν΄μ€μ μ μ©λλ 곡μ©μΈν
local.py # λ‘컬νκ²½μμ μμ
ν λ μ°λ νμΌ, λλ²κ·Έ,λ‘κ·Έλ 벨 λ±
staging.py # μ΄μνκ²½ μλ²μμ νλΌμ΄λΉλ²μ μ κ°μ§κ³ ꡬλλλ
# staging μλ²λ₯Ό μν¨. μ½λ μμ μ΄μ μ μ κ΄λ¦¬μμ κ³ κ° νμΈμ μν¨
test.py # ν
μ€νΈ λ¬λ, μΈλ©λͺ¨λ¦¬ λ°μ΄ν° λ² μ΄μ€μ μ, λ‘κ·ΈμΈν
λ± ν
μ€νΈ μν¨
production.py # μ΄μμλ²μμ μ€μ λ‘ μ΄μλλ μΈν
νμΌ
# ci.py μ§μμ ν΅ν©μλ²μμ μ°μ΄λ νμΌ
π‘ μΈν νμΌμ μ΄μ©νμ¬ κ΅¬λνκΈ°
shell : python manage.py shell --settings = projectname.setting.local
server : python manage.py runserver --settings = projectname.setting.local
--setting
μ μ΄μ©νλ λμμΌλ‘ DJANGO_SETTINGS_MODULE
κ³Ό PYTHONνκ²½λ³μ μ€μ
μ΄ μλ€.
virtualenvμ postactivate μ€ν¬λ¦½νΈλ₯Ό μ€μ νλ©΄ μ΅μ μμ΄ μλμΌλ‘ μ€μ μ΄ μ μ©λμ΄ μ€νλκΈ°λ νλ€
π‘ local setting
local.py
μΈν
νμΌμ κ²½μ° from .base import *
ꡬ문μ μ΄μ©νλ€
λ‘컬μ μ€μ νμ¬ gitμΌλ‘ 곡μ νκ² λλ©΄ κ°μ κ°λ° νκ²½μ΄ μΈν λκ² λκ³ μ€μ μ νΈλ¦¬ν¨μ κ°μ Έμ¨λ€ κ·Έλ°λ° κ°κ°μΈμ κ°λ°νκ²½ μ ν μ μ΄λ»κ² ν΄μ£Όλκ² μ’μκΉ??
μΌλ°μ μΌλ‘ dev_myname.py
μ κ°μ΄ μ¬λ¬κ°μ μΈν
νμΌμ μμ±νμ¬ νμκ°μ κ°λ°μΈν
μ μ°Έκ³ νμ¬ λμμ΄ λκΈ°λ νλ€
π¬μ½λμμ μ€μ λΆλ¦¬νκΈ°
localsettings μν° ν¨ν΄μ μ΄μ©νλ μ΄μ μ€ νλλ `SECRETKEY,API` ν€ λ± μλ²μ λ°λΌ νΉλ³νκ² μ€μ λ κ°λ€μ΄ μΈν νμΌμ μμΉν΄ μλ€λ κ²
μ€μ μ λ°°ν¬νκ²½μ λ°λΌ λ€λ₯΄μ§λ§ μ½λλ κ·Έλ μ§ μκ³ λΉλ°ν€λ€μ μ€μ κ°μ΄μ§ μ½λκ° μλλ©° λΉλ°κ°μ λ°λμ λ¨μ΄ μμ μμ΄μΌνκΈ°μ GITμΌλ‘ κ΄λ¦¬ν μ μλ€
PaaS
νκ²½μμλ λ 립λ μλ²μμ μ½λλ₯Ό μμ νλλ‘ νμ©νμ§ μλλ€
νκ²½λ³μλ₯Ό μ΄μ©νκΈ°λ‘ νκ³ νκ²½λ³μ ν¨ν΄μ΄λΌ λΆλ₯΄μ νκ²½λ³μλ₯Ό λΉλ°ν€λ₯Ό μν΄ μ΄μ©νκ² λλ©΄ κ±±μ μμ΄ μΈν νμΌμ GITμ μΆκ°ν μ μλ€.
copy& pasteκΈ°λ°μ κ°κ°μΈμ local_Settingμ μ°κΈ°λ³΄λ€ GitμΌλ‘ κ΄λ¦¬λλ λ¨μΌ setting/localμ λλ μ¬μ©ν μ μλ€.
νμ΄μ¬ μ½λ μμ μμ΄ μμ€ν κ΄λ¦¬μλ€μ΄ νλ‘μ νΈ μ½λλ₯Ό μ½κ² λ°°μΉν μ μλ€. PaaSκ° νκ²½λ³μλ₯Ό ν΅ν΄ μ΄μ©νκΈ°λ₯Ό μΆμ²νλ€
π¬νκ²½λ³μμ λΉλ°ν€ λ£κΈ°
μ μ₯λλ λΉλ°μ 보 κ΄λ¦¬λ°©λ²
μλ²μμ bashκ° νκ²½λ³μμ μμ©νλ λ°©μμ λν μ΄ν΄, PaaSμ΄μ© μ¬λΆ
μνμΉλ λ 립μ μΈ νκ²½λ³μ μμ€ν μ κ°μ§κ³ μκΈ°λλ¬Έμ local_setting antiν¨ν΄μ μ΄μ©ν μ μλ€
μ 체 νκ²½μ νκ²½λ³μλ₯Ό profileλλ bash_profileλ€μ ν€λ₯Ό λ£μμΌλ‘ μ μ©ν μλ μμ§λ§ κ°μνκ²½μ activateμ€ν¬λ¦½νΈ λ§μ§λ§λΆλΆμ λ£μμΌλ‘ νκ²½λ³μ μ€μ μ μ μ©ν μλ μλ€.
μλ²νκ²½μ λ°λΌ λ°°ν¬λꡬ λ¬Έμλ₯Ό μ°Έκ³ νμ¬ νκ²½λ³μλ₯Ό μ€μ ν΄μ€μΌνλλ°
Herokuμ νκ²½λ³μ μΈν
heroku config:set SOME_SECRET_KEY =
κ°μ Έμ€λ λ°©λ²
import os
SOME_SECRET_KEY = os.environ["SOME_SECRET_KEY"]
μ΄λ κ² ν¨μΌλ‘μ¨ λͺ¨λ μ½λκ° gitμΌλ‘ κ΄λ¦¬ ν μ μμΌλ©° λΉλ°ν€λ μμ νκ² μ μ§ν μ μλ€.
λ§μ½ λΉλ°ν€κ° μμκ²½μ°λ₯Ό λλΉν΄ μμΈμ²λ¦¬λ₯Ό ν΄μ€μΌ λλ²κΉ μ΄ μ¬μμ§λ€
μΈν λͺ¨λμμμ μ₯κ³ μ»΄ν¬λνΈ μν¬νΈλ κΈλ¬ΌμΈλ°
μμΈμ μΌλ‘ νλ‘μ νΈμ μμΈμ²λ¦¬λ₯Ό μν΄ImproperlyConfigured λ₯Ό import
ν΄ μ¬μ©ν΄μ£Όκ² λλ©΄ μμΈμ²λ¦¬λ₯Ό ν΅ν΄ 보기 μ’μ μλ¬λ©μΈμ§λ₯Ό λ§λ€μ μλ€.
β μ₯κ³ κ³΅μλ¬Έμμ λ°λ₯΄λ©΄ μ¬λ¬κ°μ settingνμΌμ μ΄μ©νκ² λλ©΄ manage.pyκ° μλ django-admin.pyλ₯Ό μ΄μ©νλΌκ³ λμ΄μλλ° manage.pyλ₯Ό μ¬μ©ν΄λ 무방νλ€
π¬νκ²½λ³μλ₯Ό μ΄μ©ν μ μλ μνμΉ μΉμλ² μ΄μ© λ° μΌλΆ Nginx κΈ°λ° νκ²½
λΉλ° νμΌν¨ν΄μ μ΄μ© (μ₯κ³ μμ μ€νλμ§ μλ νμμ νμΌμ gitμ μΆκ°νμ§ μκ³ μ¬μ©)
- JSON, config, YAML, XMLμ€ νκ°μ§ ν¬λ§·μ μ ννμ¬ μμ±
- λΉλ°νμΌμ κ΄λ¦¬νκΈ° μν λ‘λ μΆκ°
- λΉλ°νμΌμ μ΄λ¦μ gitignoreμ μΆκ°
ex) JSONμ΄μ© : secrets.json νμΌμ λ§λ€μ΄ λΉλ°ν€ κ΄λ ¨ μ 보 μ μ₯ setting νμΌμ
import json
μ μ΄μ©ν΄with open("secrets.json) as f:
μ΄μ©νμ¬ open λκ°μ΄ μμΈμ²λ¦¬λ₯Ό νμ¬ return
π¬μ¬λ¬κ°μ requirements νμΌ μ΄μ© (ν¨ν€μ§μ λ²μ λ²νΈ νκΈ°)
κ° μΈν
νμΌμ ν΄λΉνλ requirements
νμΌ μ΄μ©(κ°κ°μ νκ²½μ νμν μ»΄ν¬λνΈλ§ μ€μΉ)
-
μΆμ² ν¨ν΄
<repo directory>/ requirements/ requirements/ base.txt local.txt staging.txt
base.txt
: λͺ¨λ νκ²½μ΄ κ³΅ν΅μΌλ‘ μ΄μ©ν μμ‘΄μ±local.txt
: κ°λ°νκ²½μμ νμν ν¨ν€μ§ (-r base.txt
(base.txtνμΌ ν¬ν¨))
requirements μ΄μ©νκΈ°
pip install -r requirements/local.txt
β settingsμμ νμΌκ²½λ‘ μ²λ¦¬νκΈ°
ν νλ¦Ώ λ° λ―Έλμ΄ νμΌμ λν κ²½λ‘μλ¬κ° λ°μ νλ κ²½μ°κ° μλλ° μ λλ‘ νλμ½λ©λ μ λκ²½λ‘λ₯Ό μ¬μ©νμ§ λ§μ
μ΄λ° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ base.pyμ root λ³μ BASE_DIRμ λ§λ€μ΄ λμλ€. κ·ΈλΌ from unipath import Path λͺ¨λμ μ΄μ©νκ² λλ©΄
MEDIAROOT = BASEDIR, child(βmediaβ)
μ΄μ²λΌ κΉλνκ² μ€μ μ΄ κ°λ₯νλ€
μ°λ¦¬μ μ€μ λ€μ΄ κΈ°λ³Έμ€μ κ³Ό λΉκ΅ν΄ μΌλ§λ λ€λ₯Έμ§ νμΈ νκ³ μΆμΌλ©΄ μ½μμμ diffsettings
λͺ
λ Ήμ΄λ₯Ό μ¨λ³΄μ