본문 바로가기
Python/Django

[Django] settings.py 분리하기

by 혀나Lee 2016. 11. 16.

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

 

hyunalee419/django-settings

Contribute to hyunalee419/django-settings development by creating an account on GitHub.

github.com

 

댓글