Django Docs Tutorials (1.11 ver)

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

Part 1. Request and responses

django docs tutorials part 1

원문 : https://docs.djangoproject.com/en/1.11/intro/tutorial01/
[Writing your first Django app, part1]

[Tutorial Part 1. 사용자의 요청을 받고 거기에 응답하기]

  1. 프로젝트 만들기
  2. 개발자 서버 이용하기
  3. Polls 앱을 만들어보자
  4. View를 만들어보자
    1. url( ) 에 꼭 필요한 regex (regular expression)란?
    2. url( ) 에 꼭 필요한 view 란?
    3. url( ) 에 필요하면 써먹는 kwargs (keywords arguments)란?
    4. url( ) 에 필요하면 써먹는 name 이란?

이 튜토리얼은 장고로 간단한 투표 어플리케이션을 만드는 내용입니다. 투표 어플리케이션(이하 Polls 앱)은 크게 두 부분으로 나눠집니다. 

  1. 공개된 사이트 : 사람들이 들어와 투표를 합니다. 
  2. 관리자 사이트 : 투표내용을 관리합니다. 

이 튜토리얼은 장고가 설치되어 있는 상황을 가정 합니다. 먼저 장고의 버전을 확인해 보겠습니다. 셸 프롬프트(터미널)에 다음과 같이 입력해주세요.

python -m django --version

장고가 설치되어 있으면 버전이 나타납니다. 만약 'No module named django'라는 메시지가 뜨면 장고를 설치해주세요. 이 튜토리얼은 장고 버전 1.11과 파이썬 3.4 또는 그 이상을 이용합니다. 장고 버전이 튜토리얼과 다르면 화면 오른쪽에서 여러분의 버전에 맞는 튜토리얼로 이동하시거나, 튜토리얼과 동일한 버전으로 업데이트 해주세요. (장고 원문 페이지에 가시면 버전에 따른 튜토리얼을 보실 수 있습니다.) 파이썬 2.7을 사용하고 있다면 튜토리얼에 나온 코드 샘플을 약간 조정하셔야 할 겁니다. 주석으로 조정하는 방법을 알려드리겠습니다. 

장고 설치 방법과, 이전 버전을 지우는 방법은 How to install Django에서 볼 수 있습니다. (원문에는 기울여진 글씨에 해당 글로 이동하는 링크가 걸려있습니다. 일단 링크를 걸지 않고 넘어갑니다. 천천히 수정할게요) 

(+)Where to get help _ 어디서 도움을 받을 수 있나요? : 튜토리얼을 이용하다 문제가 생긴다면 django-users 나 #django on irc.freenode.net에 도움을 요청하세요

1. Creating a project : 프로젝트 만들기

장고의 기본적인 설정은 장고 프로젝트를 만드는 명령어에 의해 자동으로 생성됩니다. 원하는 디렉토리로 가서 다음 명령어를 커맨드 라인에 입력하세요. (디렉토리 이동 명령어 : cd + 이동하고 싶은 디렉토리 이름)

django-admin startproject mysite

위 명령어는 'mysite'라는 디렉토리를 현재 디렉토리에 만듭니다. 

(+)Note : 장고나 파이썬 안에 사용되고 있는 이름은 사용하지 마세요. 충돌이 일어납니다. 특히 django 라거나 test 같은 이름은 사용하지 마세요.

(+)Where should this code live? _ 코드를 입력할 디렉토리는 어디가 좋을까요? : 오래된 PHP를 사용하다 오신 분이라면 코드를 웹 서버 도큐먼트의 root 디렉토리에 저장하는게 익숙하실 겁니다. 하지만 파이썬 코드를 그렇게 저장하는 것은 보안상 좋지 않습니다. 사람들이 웹을 통해 코드를 읽을 수도 있으니까요. /var/www 와 같은 디렉토리가 아닌, 도큐먼트 루트(root) 바깥에 코드를 저장하세요. 예를들면 /home/mycode 같은 곳입니다. 

mysite 디렉토리 안에는 다음과 같은 구조가 자동으로 만들어져 있습니다.

  • mysite
    • manage.py
    • mysite
      • __init__.py
      • settings.py
      • urls.py
      • wsgi.py

이 구조는 각각 다음과 같은 역할을 합니다. 

- 가장 바깥쪽의 mysite 디렉토리 : 프로젝트의 시작점인 root 디렉토리입니다. 프로젝트를 담는 컨테이너라고 보면 되고, 이름을 바꿔도 아무런 문제가 없습니다. 
- manage.py : 장고 프로젝트에서 다양한 기능을 수행하는 파일(utility)입니다. 자세한 내용은 django-admin and manage.py에서 읽을 수 있습니다. 
- 안쪽의 mysite 디렉토리 : 프로젝트를 위해 파이썬 패키지가 실제로 움직이는 디렉토리입니다. 이 디렉토리의 이름은 바꾸면 안됩니다. 앞으로 무언가를 import 할 때 파이썬 패키지의 이름으로 사용하기 때문입니다. (ex. mysite.urls)
- mysite/__init__.py : 비어있습니다. 이 파일은 파이썬에게 이 디렉토리(mysite)가 파이썬 패키지라고 말해주는 역할입니다. 파이썬이 낯선 경우 파이썬 Docs의 more about packages를 읽어보세요.
- mysite/settings.py : 장고 프로젝트의 설정을 다루는 파일입니다. Django settings 에서 자세한 내용을 볼 수 있습니다. 
- mysite/urls.py : 이 장고 프로젝트에 사용될 URL들을 저장하는 곳입니다. 장고로 작동하는 사이트의 'TOC (table of contents, 목차)' 라고 할 수 있습니다. 자세한 내용은 URL dispatcher 를 참고하세요
- mysite/wsgi.py : 프로젝트를 서비스할 때 필요한 WSGI 호환 웹 서버 용 파일입니다. 자세한 내용은 How to deploy with WSGI 를 참고하세요

2. The development server : 개발자용 서버 이용하기

장고 프로젝트가 잘 작동하는지 확인해볼까요. 바깥쪽의 mysite 디렉토리로 이동하여 다음 명령어를 입력합니다. 바깥쪽의 mysite 디렉토리로 이동한다는 것은, 'manage.py' 파일이 있는 곳에서 명령어를 사용해야 한다는 뜻입니다. 

python manage.py runserver

명령어를 입력하면 다음과 같은 내용이 커맨드라인에 나타날 것입니다. 

Performing system checks...

System check identified no issues(0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

July 06, 2017 - 15:50:53
Django version 1.11, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
(+)Note : 데이터베이스 마이그레이션이 적용되지 않았다는 경고는 일단 무시하세요. 조만간 다루게 됩니다. 

파이썬으로 동작하는 웹 서버가 시작되었습니다. 이 웹서버를 장고를 통해 이용하면, 프로젝트가 완성되기 까지 아파치와 같은 실제 상황용 서버를 사용하지 않아도 되고, 빠르게 개발을 진행 할 수 있습니다. (주의 : 개발자용 서버를 실제 서비스 제공을 위해 사용하지 말아주세요.)

웹 브라우저에서 http://127.0.0.1:8000 으로 들어가면 "Welcome to Django"라는 하늘색 파스텔톤 페이지가 나타납니다. 장고가 잘 동작하고 있다는 뜻입니다!

(+)포트를 변경하는 방법 _ runserver 명령어는 기본적으로 포트 8000번에서 개발자용 서버를 시작합니다. 서버의 포트를 바꾸고 싶다면 포트 번호를 명령어에 추가합니다. 예를들어 다음 명령어는 서버를 포트 8080번에서 시작합니다. 

[ python manage.py runserver 8080 ]

서버의 IP 를 바꾸고 싶다면, 포트번호와 함께 명령어에 추가합니다. 예를 들어 접근가능한 모든 공용 IP를 청취하고 싶다면 (Vargant를 실행중이거나, 네트워크 상의 다른 컴퓨터에서 현재 작업하는 프로젝트를 보고 싶을 때 유용합니다.) 다음 명령어를 사용하세요.

[ python manage.py runserver 0:8080 ]
0는 0.0.0.0의 줄임말입니다. 개발자용 서버에 대해 자세히 알고 싶다면 runserver 를 참고하세요.

(+)개발자 서버의 자동 새로고침 _ 개발자용 서버는 알아서 파이썬 코드를 새로고침합니다. 코드를 수정한 다음 결과를 확인하기 위해 매번 서버를 새로 시작할 필요가 없습니다. 하지만 가끔 새로고침이 적용되지 않는 부분이 있습니다. 그런 경우는 서버를 재시작해주세요.

3. Creating the Polls app : Polls 앱을 만들어보자

자, 이제 '프로젝트'의 준비가 끝났습니다. 일을 시작할 시간입니다. 
장고로 만들 각각의 기능(어플리케이션)들은 특정한 규칙을 따르는 파이썬 패키지로 구성됩니다. 장고는 어플리케이션을 위한 기본적인 디렉토리 구조를 알아서 만들어주기 때문에, 우리는 코드를 쓰는데 집중하면 됩니다. 

(+)Projects 와 app(application)은 뭐가 다를까?
app이란 실제로 무언가를 합니다. 어떤 동작이나 기능을 해요. 예를들면, 웹 로그 시스템이라든지 공공 기록의 데이터베이스 역할이라든지, 간단한 투표 같은 것 말입니다. 반면 프로젝트는 어떤 웹 사이트를 위한 설정파일과 앱(기능)들을 모아놓은 '모음집' 같은 것입니다.

하나의 프로젝트는 다양한 앱을 포함할 수 있고, 하나의 앱은 다양한 프로젝트에 포함될 수 있습니다. 

우리의 앱은 python path 위에서라면 어디서든 작동합니다. 이 튜토리얼에서는 poll app을 manage.py 파일 바로 옆에 만들 겁니다. 이렇게 하면 poll 앱은 (안쪽)mysite의 하위 모듈이 아니라 자체적인 최상위 모듈로 동작하게 됩니다. 

앱을 만들기 위해 manage.py가 있는 디렉토리에서 다음 명령어를 입력합니다. 

python manage.py startapp polls

이 명령어는 polls라는 디렉토리를 만들고, 그 디렉토리 안에는 자동으로 다음과 같은 구조가 만들어집니다. 

  • polls/
    • __init__.py
    • admin.py
    • apps.py
    • migrations/
      • __init__.py
    • models.py
    • tests.py
    • views.py

이 구조에 투표 기능이 담기게 됩니다. 

4. Write your first view : View를 만들어보자!

첫번째 뷰를 만들어 봅시다.  polls/views.py 를 열고 다음과 같은 파이썬 코드를 입력합니다. 

작성위치_ polls/views.py

# current directory : polls/views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello world. You're at the polls index.")

이 코드는 장고의 가장 단순한 view 입니다. view를 불러오기 위해서는 URL이 연결되어야 하죠. URL은 URLconf(URL configuration)를 이용해 설정합니다. polls 디렉토리 안에 URLconf를 만들건데요, 파일이름은 urls.py라고 하겠습니다. 이 파일이 앞으로 URL 설정(URLconf)을 담당하게 될 겁니다. urls.py를 추가하면 polls app의 구조는 다음과 같아집니다. 

  • polls/
    • __init__.py
    • admin.py
    • apps.py
    • migrations/
      • __init__.py
    • models.py
    • tests.py
    • urls.py
    • views.py

polls/urls.py안에 다음과 같은 코드를 입력해보겠습니다. 

# Current directory : polls/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    ]

다음으로 할 일은, mysite/urls.py 라는 첫번째 URLconf 파일이 polls디렉토리의 urls.py를 가리키도록 설정하는 겁니다. mysite/urls.py 에 django.conf.urls.include를 import 하고, include( ) 메소드(*미리 만들어져 있는 기능을 하는 함수들을 말합니다.) 를 urlpatterns 목록에 삽입합니다. mysite/urls.py 를 다음과 같이 수정해주세요. 

# Current directory : mysite/urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
    ]

include( ) 는 다른 URLconf를 참조할 수 있게 하는 역할을 합니다. include( )를 위한 정규표현식에 $ 가 사용되지 않는다는 점($는 문자열의 끝을 의미합니다) 주의 하시구요. $대신 슬래시(/)로 정규표현식이 끝납니다. 장고는 include( )를 마주치면 그 시점까지 일치한 URL부분은 잘라버리고, 남은 부분을 include( )안의 URLconf로 보내서 처리합니다. 

include( ) 는 URL을 갖고 놀기 쉽도록 고안된 녀석입니다. include( )를 사용하면 polls앱이 "/polls/"든 "/fun_polls/"든 "/content/polls"든, 그 어디에 있든지 작동할 수 있습니다. polls 앱이 자기자신 안의 polls/urls.py 라는 URLconf에 등록되어 있으니까요.

(+)언제 include( ) 를 사용할까? : 다른 URL 패턴을 포함하고 싶다면, admin.site.urls를 빼고 모든 상황에 사용합니다. 
(+) include(admin.site.urls)라고 쓰여있다면? : 사용중인 장고 버전이 튜토리얼의 장고 버전과 다른 것 같습니다. 더 이전의 튜토리얼을 보시거나, 장고 버전을 업데이트 해주세요. 

이제 우리는 index 라는 view를 URLconf 에 연결했습니다. 이게 동작하는지 한 번 볼까요. 아래 명령어를 터미널에 입력합니다. 

python manage.py runserver

브라우저 주소창에 http://localhost:8000/polls/ 라고 입력하세요. 그러면 "Hello, world. You're at the polls index." 라는 글이 보일 겁니다. index view안에 입력했던 내용이죠. 

url( ) 메소드는 네 개의 arguments를 이용합니다. regex와 view는 필수적으로 필요하지만, kwargs와 name 필요한 경우에 골라서 사용하면 됩니다. 이 네가지 인자들이 어떻게 사용되는지 좀 더 알아보겠습니다. 

- url( ) 필수인자 : regex

'regex'라는 단어는 regular expression을 줄인 말입니다. '정규표현식'이라고 부릅니다. 보통 문자열의 패턴이 서로 일치하는지 확인할 때 쓰이는데, 여기서는 url패턴을 맞춰보는데 사용되고 있습니다. 장고는 첫번째 정규 표현식에서 시작하여 목록을 훑어내려갑니다. 사용자가 보낸(요청한) URL과 각각의 정규표현식을 비교하면서, 일치하는 것을 찾을 때까지요. 

이 정규 표현식들은 GET 과 POST 매개변수(parameters) 또는 도메인(domain name)은 검색하지 않습니다. 예를 들어 request가 https://www.example.com/myapp/ 인 경우 URLconf는 myapp/을 찾아다닙니다. (www.example.com이라는 도메인은 찾지 않습니다.) request가 https://www.example.com/myapp/?page=3일 때도 마찬가지입니다. (?page=3 이라는 GET or POST요청을 찾지 않습니다)

만약 정규표현식에 더 알고 싶다면 wikipedia's entryre 모듈에 대한 문서를 참고하세요. O'Reilly의 책인 'Mastering Regular Expressions" (by. Jeffrey Friedl)도 추천합니다. 하지만 이 튜토리얼에서는 굳이 정규표현식 전문가가 될 필요가 없습니다. 단순한 패턴을 잡아내는 방법만 알아도 충분합니다. 사실, 복잡한 정규표현식이 오히려 성능이 떨어질 수도 있고요. 정규표현식에 모든 것을 의지하는건 좋지 않습니다. 

참고로 성능에 대해 덧붙이자면, 여기서 사용된 정규표현식은 URLconf 모듈이 불러와질때 컴파일되고, 무척 빠릅니다. (앞에서 말한 것처럼 너무 복잡한 조회를 하지 않는다면요)

- url( ) 필수인자 : view

장고가 정규표현식(첫번째 필수 인자)을 보고 일치하는 것을 찾은 경우, 특정한 view 함수를 불러옵니다. 이 함수는 HttpRequest 객체를 첫번째 인수로 받고, 그 다음으로 정규 표현식에서 일치한 값을 사용합니다. 정규표현식에서 '단순한 값'이 일치했다면 그 값은 위치인수(positional arguments)로써 view 함수에 전달됩니다. 만약 '이름있는 값'이 일치했다면 그 값은 키워드 인수(keywords arguments)로써 view 함수에 전달됩니다. 이 부분은 곧 예제로 다뤄볼 것입니다. 

- url( ) 선택사항 : kwargs

kwargs는 keywords arguments의 줄임말입니다. 임의의 키워드 인수는 타겟이 된 뷰의 dictionary로 전달될 수 있습니다만, 튜토리얼에서는 다루지 않습니다. 

- url( ) 선택사항 : name

URL의 이름을 지정하면 장고 어디에서든 명확하게 그것을 참조할 수 있습니다. 특히 템플릿 없이도 말입니다. 이 방식은 하나의 파일을 수정해서 프로젝트 전체의 URL 패턴을 변경할 수 있는 강력한 힘을 가집니다. 

 

여기까지, 기본적인 request와 response의 흐름에 대해 알아보았습니다. 사용자가 요청한 것에 대해 응답해주는 내용이죠. 여기에 익숙해졌다면 part 2로 넘어가 보겠습니다. 

  • 봤어요 (0명)

댓글

댓글 본문
버전 관리
Noah
현재 버전
선택 버전
graphittie 자세히 보기