원본 출처
장고(Django)는 웹 애플리케이션을 만들기 위한 파이썬 기반의 프레임워크로, 튼튼하며, 오픈 소스이다. 장고의 인기는 지난 2년 동안 증가해왔고, 이미 성숙한 단계에 있으며, 실제로 큰 규모의 단체들에게 이용되어진다.
웹 애플리케이션을 제작하기 위한 다른 파이썬 기반의 프레임워크들(Flask, Pyramid) 중에서도 장고는 가장 인기가 많다. 장고는 파이썬 버전 2.7과 3.6을 모두 지원한다. 이 글을 쓰는 시점에서 파이썬 2.7은 커뮤니티, third party packages, 그리고 온라인 문서화의 측면에서 여전히 이용가능한 버전이다. 장고는 적절하게 사용되면 안전하고, 높은 차원의 유연성을 제공한다. 바로 다음 내용이 파이썬을 사용한 서버 사이드 애플리케이션을 개발할 때 더 나아갈 수 있는 방법이다.
한 사람의 숙력된 파이썬 그리고 장고 개발자로써, 장고 설정(setup)에 대해 내가 몇 년동안 배우고 모아왔던 몇 가지 최고의 실행 방법을 여러분들과 공유할 것이다. 당신이 몇 개의 장고 프로젝트를 수행했는지, 혹은 이제 막 하나를 시작하는 단계인지와는 상관없이 여기에 기술된 방법들은 당신이 미래에 더 나은 애플리케이션을 만들도록 도와줄 것이다.
나는 당신들이 몇몇 툴들을 당신만의 개발 도구상자에 즉시 추가할 수 있도록 매우 실용적인 마음으로 이 글을 썼다. 당신은 심지어 다음 프로젝트를 위해 직접 제작한, 더욱 발전된 형태의 장고 표준 문서를 만들 수도 있다.
이 글의 목적을 위해, 당신이 리눅스 우분투(Linux Ubuntu)를 사용하고 있다고 가정한다.
글에서, $ 기호로 시작하는 1줄짜리 코드들은 해당 줄이 터미널에서 입력되어 져야 한다는 것을 강조하기 위한 것이다. 복붙할 때 $ 기호는 제외하라.
(자, 레쓰게릿)
Virtual Environment
파이썬 기반의 애플리케이션을 개발하는 과정에서, 지속적으로 third party package를 이용해왔다. 이러한 패키지들은 자주 업데이트되어지므로, 패키지들을 지속적으로 준비하는 것이 필수이다. 하나의 로컬 컴퓨터에서 다수의 프로젝트를 개발할 때, 각 패키지의 현 버전의 트랙(track)을 유지하는 것이 문제이다. 그 이유는 다른 프로젝트에서 같은 패키지의 다른 버전을 사용하는 것이 불가능하기 때문이다. (프로젝트 A에서 패키지 P의 1.2 버전을 사용하는데, 프로젝트 B에서 패키지 P의 1.4버전을 사용할 수 없다.) 게다가, 한 프로젝트에서 패키지를 업데이트하는 것이 다른 프로젝트에서 하나 또는 여러 개의 기능(functionality)의 역할을 하는 패키지들을 멈추게 할 수도 있다.
이런 문제는 가상 환경을 통해 해결될 수 있다. 직접 가상 환경(Virtual Environment)을 설정해보자.
우선 가상환경을 설치하라.
$ apt-get update
$ apt-get install python-pip python-dev build-essential
$ export LC_ALL="en_US.UTF-8" # 다음 줄에서 에러가 뜰 경우 쉘 환경 변수를 등록하라.
$ pip install --upgrade pip
$ pip install --upgrade virtualenv
$ mkdir ~/.virtualenvs
$ pip install virtualenvwrapper
$ export WORKON_HOME=~/.virtualenvs
$ nano ~/.bashrc
~/.bashrc 의 파일 끝에 아래 줄을 추가하라.. /usr/local/bin/virtualenvwrapper.sh
(반드시 해당 경로에 해당 파일이 있는지 확인한 후 추가하세요.)
(만약 파일이 없다면, find / -name "virtualenvwrapper.sh" 명령어로 경로를 찾길 바랍니다.)
실행하라.
설치가 끝나면, 프로젝트이름을 타이핑해서 새 가상 환경을 만들어라.
$ mkvirtualenv project_name
가상 환경에 있는 동안은 터미널에서 아래처럼 접두사가 추가된다는 것을 볼 것이다.
(project_name) ofir@playground:~$
가상 환경을 나가기 위해선 아래의 명령어를 사용하라. 이 명령어로 인해 로컬 컴퓨터의 실제 파이썬 컨텍스트로 되돌아 간다.
특정 가상 환경 컨텍스트를 시작하려면 아래의 명령어를 사용하라.
본인의 로컬 머신에 존재하는 가상 환경들의 목록을 보려면 아래의 명령어를 사용하라.
로컬
컴퓨터의 가상환경에서 프로젝트 의존성을 갖는 것은 분리된 환경에서 패키지들을 유지하도록 한다. 즉, 하나 또는 다수의
프로젝트만을 위해 특정 패키지들을 사용한다. 새 가상환경을 만들 때, 당신은 설치된 패키지 없이 완전히 새로운 가상환경에서 시작할
것이다. 그 때는 다른 가상환경에 있는 프로젝트와 동일한 패키지를 설치하더라도 다른 버전을 사용할 수 있다.
장고 설치를 예로 들면,
(project_name) $ pip install Django==1.11
(현재 장고 최신 버전은 2.0.5)
위에서 설치한 장고 1.11 버전은 오직 그 환경(여기선 project_name)에서만 이용가능한 것이다. 당신의 주요 파이썬 인터프리터 또는 로컬 컴퓨터의 다른 가상 환경 모두 당신이 그 환경에서 설치했던 새로운 장고 패키지에는 접근할 수 없을 것이다.
가상 환경을 이용하여 서버를 실행하는 명령을 사용하기 위해, 가상환경의 컨텍스트에서 아래와 같은 명령어를 사용하라.
(project_name) $ cd /path/to/django/project
(project_name) $ ./manage.py runserver
마찬가지로, 가상환경에서 파이썬 인터프리터에 들어가려면,
이미 그 환경에서 설치된 패키지들을 이용할 수 있다.
Requirements
Requirements는 프로젝트에서 사용중인 파이썬 패키지의 목록으로, 각 패키지마다 이름과 버전이 함께 기록되어 있다.
아래는 requirements.txt 파일의 예시이다.
dicttoxml==1.7.4
Django==1.11.2
h5py==2.7.0
matplotlib==2.0.2
numpy==1.13.0
Pillow==4.1.1
psycopg2==2.7.1
pyparsing==2.2.0
python-dateutil==2.6.0
pytz==2017.2
six==1.10.0
xmltodict==0.11.0
requirements.txt
파일을 최신으로 유지하는 것은 다른 개발자들과 적절히 협업하는 데 있어 필수적이다. 또한 당신의 배포 환경을 적절하게 설정하는
것도 중요하다. 이 파일이 Code Repository 에 포함되어 있으면, 단 한 줄만 터미널에 입력하면 가상 환경에서 설치된
모든 패키지들을 업데이트할 수 있다. 그 때는 매우 짧은 시간에 실행하므로, 함께 일할 개발자를 깨울 수 있다.
새 requirements.txt 파일을 생성하거나 기존의 것을 갱신하기 위해, 가상환경 내에서 아래와 같은 명령어를 사용하라.
(project_name) $ pip freeze > requirements.txt
당신의 편리함을 위해, 이 명령어가 Git 저장소에 의해 트랙되어진 폴더에서 실행하는지 확인하라. 이는 다른 코드의 인스턴스가 requirements.txt 파일에 접근하는 것을 가능하게 한다.
만약 새 개발자가 팀에 합류하면, 또는 당신이 requirements.txt 파일에 기록된 동일한 패키지를 사용하는 새 환경을 설정하길 원한다면, 가상 환경 컨텍스트에서 아래의 명령어를 실행하라.
(project_name) $ cd /path/to/requirements/file
(project_name) $ pip install -r requirements.txt
파일에
기록된 모든 요구사항은 즉시 당신의 가상환경에 설치될 것이다. 오래된 버전들은 갱신될 것이고, 새로운 버전들은 파일의 요구사항에
정확히 맞추고자 다운그레이드(downgrade)될 것이다. 당신이 여전히 유지하길 원하는 환경들 사이에서 차이가 있을지도
모른다는 것에 주의하라!
나는
당신의 Work flow에 이 명령어들을 통합하는 것을 적극 추천한다. 저장소에 코드를 push 하기 전에
requirements.txt 파일을 갱신하라. 그리고 저장소로부터 코드를 pull한 후에 requirements.txt 파일을
설치하라.
Better settings.py configuration
장고는
매우 기본적이고 유용한 settings.py 파일을 즉시 사용할 수 있다. (즉, 기본적으로 제공한다는 소리) 이 파일은 당신의
프로젝트에서 메인이 되고, 매우 유용한 설정들을 정의한다. 또한 매우 간단하다. 다만 가끔, 개발자가 팀에서 일할 때, 배포
환경을 설정할 때, 혹은 당신이 기본으로 제공되는 settings.py 파일을 둘 이상 필요로 할 때 등 다양한 설정 파일이
요구될 수 있다.
다수의 설정 파일들은 개별적으로 각 환경을 위해 쉽게 사용자가 맞춤형으로 설정할 수 있게 한다. (여기서 환경은 위에서 언급한 가상 환경이 아닌, 실행 환경을 의미)
ALLOWED_HOSTS # for production environment
DEBUG
DATABASES # for different developers on the same team
settings.py 파일을 설정하기 위한 확장된 접근법을 제안하겠다. 이 방식은 당신이 다른 버전들을 유지하도록 해주고, 어떤 특정 시간과 특정 환경에서 원하는 패키지를 사용하도록 해준다.
첫번째, settings.py 파일 경로로 들어가라.
(project_name) $ cd /path/to/settings/file
(장고 프로젝트 폴더에 들어가면 project_name/settings.py 경로)
그 다음, settings 라는 이름의 새 모듈(=디렉토리)를 생성하라. 모듈은 __init__.py 파일을 포함하는 폴더이다.
(project_name) $ mkdir settings
settings.py 파일을 base.py 로 이름을 바꾸고 위에서 생성한 새 모듈(settings 폴더)로 그 파일을 옮겨라.
(project_name) $ mv settings.py settings/base.py
이 예시에서는, 당신이 개발환경과 배포환경만을 위한 하나의 settings 파일을 설정하길 원한다고 가정을 한다. 같은 팀 내 다른 개발자들은 다른 settings 파일을 정의하기 위해 정확히 동일한 방법을 사용할 수 있다.
개발 환경을 생성하라.
(project_name) $ nano settings/development.py
해당 파일 내에 아래와 같이 입력하라.
from .base import *
DEBUG = True
배포 환경을 생성하라.
(project_name) $ nano settings/production.py
해당 파일 내에 아래와 같이 입력하라.
from .base import *
DEBUG = False
ALLOWED_HOSTS = [‘app.project_name.com’, ]
이제는 당신이 구체적인 환경의 설정을 갱신하거나 추가하길 원할 때마다, 자신만의 settings 파일에서 쉽게 구현할 수 있다.
여러분들은 "장고는 각 환경에서 어떤 settings 파일을 로드할 지 어떻게 아는가"에 대해 궁금할 지도 모른다. 그것은 바로
__init__.py 파일이 이용되는 이유이다. 예를 들어, 서버를 실행할 때 로드하기 위해 장고가 settings.py를 찾을
때, 장고는 정확히 settings.py 파일 보다는 settings 모듈을 찾는다. 하지만 그 모듈이 __init__.py 파일을
포함해야만 장고가 그 모듈이 settings.py 파일과 같은 것이란 걸 알게 된다. 장고가 __init__.py 파일안에 무엇이
쓰여졌든지 그 파일을 로드해서 실행할 것이다.
그러므로, 우리는 어떤 settings 파일을 __init__.py 파일 안에 로드할 지를 정의할 필요가 있다.
(project_name) $ nano settings/__init__.py
파일 안에 아래와 같이 타이핑 하라. (배포 환경으로 설정할 경우)
from .production import *
이 방식에서, 장고는 매 실행마다 base.py와 production.py 를 모두 로드할 것이다.
이제
남은 유일한 설정은 당신의 .gitignore 파일에 __init__.py를 기록하는 것이다. 그래서 push와 pull을 할 때
포함되지 않게 한다. 일단 새 환경을 설정하면, settings 모듈에 새 __init__.py 파일을 생성하는 것을 잊지말라.
그 다음 전에 수행했던 것처럼 정확하게 요구되는 settings 파일을 임포트(import)하라.
끝으로,
이 글에서는 우리는 장고 프로젝트를 더 효율적으로 설정하기 위한 세 가지 (베스트) 실행 방식을 다루어보았다.
가상환경에서 작업하는 것
워크플로우에서 지속적으로 requirements.txt를 이용하고, 파일을 최신의 것으로 유지하는 것
settings 모듈을 사용하여 설정하는 것