Django project 에서 프로젝트의 설정을 나타내는 파일인 settings.py 모듈. 여러 사람이 한 프로젝트에서 작업을 하다보면 데이터베이스 설정을 바꿔가며 작업을 하는 경우가 있다.
예를 들어, 테스트를 하기 위해서 자신의 로컬 데이터베이스로 설정값을 바꿔놓고 저장소에 push 하면 이 코드를 실제 데이터베이스 정보로 바꿔야 하는 작업이 필요하다. 이러한 상황은 생각보다 자주 일어나며 이 상황이 반복되면 git 저장소에 불필요한 활동 기록이 쌓이게 된다. 그래서 이 페이지에서는 settings.py 모듈을 분리하여 실제 데이터베이스와 로컬 데이터베이스 설정 값을 나눠서 관리하는 방법을 설명할 것이다.
프로젝트 생성
일단 작업을 시작할 프로젝트를 생성한다.
# 장고가 설치되어 있지 않다면 장고를 설치한다.
$ sudo pip install django
# 프로젝트 생성
$ django-admin startproject base
장고 관리자 명령어로 프로젝트를 생성해 준다. 참고로 'base'의 위치에 프로젝트명을 적어주면 되지만 기본 프로젝트 명을 base로 설정해두면 app을 추가했을 때 비교하기 편하므로 위와 같이 만드는 것이 좋다.
장고 실행
$ python manage.py runserver
# 브라우저 접속
http://127.0.0.1:8000/
장고에서 기본으로 제공해주는 로컬 서버를 manage.py 명령어를 이용하여 생성된 장고 프로젝트가 잘 실행되는지 확인한다. http://127.0.0.1:8000/ 에 접속하여 It worked! 메시지가 있는 화면이 뜨면 잘 실행되는 것이다.
settings.py 분리
장고 프로젝트가 실행되는 것이 확인이 되면 바로 settings.py 을 분리하기 시작하자!
1. settings 폴더 추가
drwxr-xr-x 6 ihyeon-a staff 204 11 16 11:05 .
drwxr-xr-x 4 ihyeon-a staff 136 11 16 11:05 ..
-rw-r--r-- 1 ihyeon-a staff 0 11 16 11:05 __init__.py
-rw-r--r-- 1 ihyeon-a staff 2633 11 16 11:05 settings.py
-rw-r--r-- 1 ihyeon-a staff 698 11 16 11:05 urls.py
-rw-r--r-- 1 ihyeon-a staff 385 11 16 11:05 wsgi.py
settings.py 모듈이 있는 base 폴더 안의 파일 구조를 보면 위와 같이 되어있을 것이다. 우리는 settings.py 을 분리해야 하기 때문에 settings 라는 이름으로 폴더를 하나 추가해 준다.
ihyeon-aui-MacBook-Pro:base ihyeon-a$ mkdir settings
ihyeon-aui-MacBook-Pro:base ihyeon-a$ ls -al
total 24
drwxr-xr-x 7 ihyeon-a staff 238 11 16 11:06 .
drwxr-xr-x 4 ihyeon-a staff 136 11 16 11:05 ..
-rw-r--r-- 1 ihyeon-a staff 0 11 16 11:05 __init__.py
drwxr-xr-x 2 ihyeon-a staff 68 11 16 11:06 settings
-rw-r--r-- 1 ihyeon-a staff 2633 11 16 11:05 settings.py
-rw-r--r-- 1 ihyeon-a staff 698 11 16 11:05 urls.py
-rw-r--r-- 1 ihyeon-a staff 385 11 16 11:05 wsgi.py
2. settings.py 모듈 복사
ihyeon-aui-MacBook-Pro:base ihyeon-a$ cp settings.py settings/base.py
ihyeon-aui-MacBook-Pro:base ihyeon-a$ ls -al settings/
total 8
drwxr-xr-x 3 ihyeon-a staff 102 11 16 11:08 .
drwxr-xr-x 7 ihyeon-a staff 238 11 16 11:06 ..
-rw-r--r-- 1 ihyeon-a staff 2633 11 16 11:08 base.py
장고 프로젝트 생성 시에 만들어진 settings.py 모듈을 settings/ 폴더 안에 'base.py' 이름으로 복사한다.
3. dev.py/local_settings.py 생성
ihyeon-aui-MacBook-Pro:base ihyeon-a$ cd settings
ihyeon-aui-MacBook-Pro:settings ihyeon-a$ vi base.py
ihyeon-aui-MacBook-Pro:settings ihyeon-a$ vi dev.py
base.py 모듈에서 DATABASES 정보를 작성해 놓은 부분을 복사하여 dev.py 에 붙여 넣는다. base.py 모듈에서는 설정 정보를 지운다.
from base.settings.base import *
# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
위와 같이 복사한 DATABASES 설정 정보를 dev.py 에 붙여넣은 뒤, 가장 윗 줄에 from base.settings.base import * 를 추가한다. 이 부분을 추가하지 않으면 SECRET_KEY error 가 발생한다.
ihyeon-aui-MacBook-Pro:settings ihyeon-a$ cp dev.py local_settings.py
ihyeon-aui-MacBook-Pro:settings ihyeon-a$ ls -al
total 24
drwxr-xr-x 5 ihyeon-a staff 170 11 16 11:13 .
drwxr-xr-x 7 ihyeon-a staff 238 11 16 11:06 ..
-rw-r--r-- 1 ihyeon-a staff 2414 11 16 11:12 base.py
-rw-r--r-- 1 ihyeon-a staff 251 11 16 11:13 dev.py
-rw-r--r-- 1 ihyeon-a staff 251 11 16 11:13 local_settings.py
ihyeon-aui-MacBook-Pro:settings ihyeon-a$ vi dev.py
dev.py 를 local_settings.py 이름으로 복사한다.
- dev.py: 실제 서비스를 실행시킬 때 필요한 정보를 작성한다.
- local_settings.py: 로컬에서 테스트를 할 때 필요한 정보를 작성한다. (저장소에 올리지 않을 것이다.)
4. 장고 실행하기
ihyeon-aui-MacBook-Pro:base ihyeon-a$ rm settings.py
ihyeon-aui-MacBook-Pro:base ihyeon-a$ cd ..
ihyeon-aui-MacBook-Pro:base ihyeon-a$ python manage.py runserver
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
utility.execute()
...
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/django/conf/__init__.py", line 113, in __init__
raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.")
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
settings.py 을 삭제하고 장고 runserver 명령어를 통해 실행시키려고 하면 SECRET_KEY 에러가 날 것이다.
우리는 기존에 있던 settings.py 을 지웠기 때문에 runserver 명령어 만으로는 장고가 설정 정보를 볼 수 없기 때문이다. 따라서 제대로 실행시키기 위해서는 runvser 명령어를 수행할 때 --settings 옵션을 추가해야 한다.
ihyeon-aui-MacBook-Pro:base ihyeon-a$ python manage.py runserver --settings=base.settings.local_settings
Performing system checks...
System check identified no issues (0 silenced).
November 16, 2016 - 02:22:23
Django version 1.8.13, using settings 'base.settings.local_settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
--settings 옵션에 dev 또는 local_settings 를 볼 수 있도록 설정해 주면 서버가 제대로 실행이 된다.
마찬가지로 브라우저에서 아래와 같은 화면이 뜨면 제대로 실행이 되는 것이다.
.gitignore 파일 추가
project 파일 폴더 추가
위에서 장고 프로젝트를 base 로 만든 이유는 장고는 manage.py 과 같은 위치 상에 있는 base 가 실제 프로젝트이며 base 폴더와 manage.py 을 감싸고 있는 base 폴더는 껍데기 폴더이다.
따라서 가장 바깥에 만들어진 폴더명은 우리 마음대로 수정해도 문제가 되지 않는다.
또한, 장고 프로젝트 외에 .gitignore 나 config 같은 설정 파일들을 추가하는 경우가 많기 때문에 프로젝트명으로 폴더를 하나 추가하여 위에서 만든 장고 프로젝트를 넣는다.
이렇게 작업을 하고 나면 아래와 같은 폴더 구조가 될 것이다.
project_name/ # 추가한 폴더
- project_name/ # base 로 만들어졌던 껍데기 폴더
- base/
- settings/
- __init__.py # 추가 안해도 실행이 되는 듯.. (settings 폴더는 패키지가 아니기때문에 가능한 것 같다.)
- base.py
- dev.py
- local_settings.py
- __init__.py
- urls.py
- wsgi.py
- db.sqlite3
- manage.py
.gitignore 는 저장소에 불필요한 파일이 업로드 되는 것을 방지하는 기능이 있다. 이 파일은 https://www.gitignore.io/ 사이트에서 필요한 정보들을 검색해서 쉽게 만들 수 있다.
예로, python, pycharm, django, osx, windows, linux 등과 같이 단어를 적어 넣은 후 Generate 버튼을 클릭하면 아래와 같은 복잡한 화면이 뜬다.
# Created by https://www.gitignore.io/api/pycharm
### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff:
.idea/workspace.xml
.idea/tasks.xml
# Sensitive or high-churn files:
.idea/dataSources/
.idea/dataSources.ids
.idea/dataSources.xml
.idea/dataSources.local.xml
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml
# Gradle:
.idea/gradle.xml
.idea/libraries
...
위의 내용을 복사하여 프로젝트의 최상단 위치에 .gitignore 라는 파일을 만든 후 붙여 넣는다.
project_name/ # 추가한 폴더
- project_name/ # base 로 만들어졌던 껍데기 폴더
- base/
- settings/
- __init__.py # 추가 안해도 실행이 되는 듯.. (settings 폴더는 패키지가 아니기때문에 가능한 것 같다.)
- base.py
- dev.py
- local_settings.py
- __init__.py
- urls.py
- wsgi.py
- db.sqlite3
- manage.py
- .gitignore
https://github.com/hyunalee419/django-settings
'Python > Django' 카테고리의 다른 글
[Django] settings 파일에 선언한 값 가져오기 (0) | 2016.12.28 |
---|---|
[Django] tuple' object has no attribute '_meta' (0) | 2016.12.22 |
[Django] Database Dynamic Access (0) | 2016.11.14 |
[Django] django-crontab (0) | 2016.10.28 |
[Django] values() values_list() flat (0) | 2016.10.26 |
댓글