FrontEnd
Javascript
Diary
ML
CS
Django
Algorithm
AWS
Co-Work
HTML
CSS
Python
React
ReactNative

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 λͺ…λ Ήμ–΄λ₯Ό 써보자