Tutorials
튜토리얼 1. 요청과 응답
( 2.3___Writing your first Django app, part.1 : Requests and responses )
장고는 파이썬이라는 프로그래밍 언어를 바탕으로 하는 웹 프레임 워크입니다. 그리고 우리의 목적은 장고를 이용해 웹 어플리케이션을 만드는 것입니다. [컴퓨터 공학 기초]에서 배웠듯이, 웹 어플리케이션(일반적인 예 : 웹 사이트)이란 기본적으로 사용자(user)가 '요청'한 것에 대해 데이터베이스에서 정보를 불러와 '응답'하는 방식으로 동작합니다.
튜토리얼 1에서는 이와 같은 웹 어플리케이션의 기본 요소가 동작하도록 설정해 보겠습니다.
세부 목차는 다음과 같습니다.
- '프로젝트' 만들기
- '개발용 서버' 만들기
- '앱' 만들기
- '뷰' 만들기
우리는 '프로젝트'를 만들고, 그 프로젝트를 실험해 볼 '개발용 서버'를 열고, 프로젝트에 '앱'( =application = 기능)을 추가하고, 그
앱을 사용자에게 보여주기 위한 '뷰'를 설정할 것입니다.
(+)그 외에 추가적으로 'url'에 대해 알아보겠습니다.
1. Requests and responses
2.3___Writing your first Django app, part.1
2.3.1__Creating a project 2.3.2__The development server 2.3.3__Creating the Polls app
2.3.4__Write your first view
- url( ) argument: regex
- url( ) argument: view
- url( ) argument: kwargs
- url( ) argument: name
(중간중간 원본 글에는 없는 부가적 내용이 추가될 수 있습니다. 일부 내용이 생략될 수 있습니다. 오류가 있을 수 있습니다.)
우리는 이 튜토리얼을 따라 웹페이지에 간단한 투표 기능을 만들어보겠습니다. 우리가 만들 투표 기능은 두가지로 나눌 수 있습니다.
- 사람들이 목록을 보고 투표할 수 있는 바깥에 드러나는 영역
- 우리가 투표기능을 관리하는 관리영역
이미 장고가 설치되어 있다고 가정하고 튜토리얼을 시작합니다. (지금 이 튜토리얼을 실행할 위치가 가상환경인지 확인해주세요.)
터미널을 열고 $ 뒤쪽에 아래 명령어를 입력합니다.
python -m django --version
장고가 설치되어 있다면, 설치된 버전에 대한 정보가 나옵니다. 설치되어 있지 않다면 'No module named django' 라는 오류 메시지가 나타납니다.
이 튜토리얼은 장고 1.10버전과 파이썬 3.4버전(그리고 그 이상)이 바탕입니다. 장고 버전이 다르다면 원본 페이지 아래의 오른쪽 구석에서 다른 버전의 튜토리얼을 이용하거나 장고를 최신 버전으로 업데이트 합니다.
(1) 프로젝트 만들기
2.3.1__Creating a project
프로젝트를 만들어 보겠습니다.
커맨드라인(cmd, terminal... 등등. 앞으로 '터미널'로 통일합니다.)에서 cd(change directory)라는 명령어를 이용하여 이 프로젝트를 진행할 폴더로 이동합니다. 그리고 터미널에 아래 명령어를 입력합니다.
django-admin startproject mysite
위의 명령어는 현재 위치에 mysite라는 디렉토리(=폴더. 앞으로 폴더로 통일합니다.) 를 만듭니다.
startproject라는 명령은 mysite라는 폴더를 만들고 그 안에 manage.py 와 또다른 mysite 라는 폴더를 만듭니다. 튜토리얼을 진행하며 이름에 혼동이 생기기 때문에 바깥쪽의 mysite 폴더의 이름을 바꿔줍니다. (상위 폴더에서 터미널에 mv [원래이름] [바꿀이름] 을 입력하면 됩니다. *차후 좀 더 쉽게 설명 추가할 것)(*폴더구조 이미지 빨리 추가할 것..)
이 두번째 mysite 폴더 안에는
__init__.py
settings.py
urls.py
wsgi.py
라는 파일들이 들어있습니다.
*윈도우 넘어가서 이미지 추가할 것
이 파일들은 각각 다음과 같은 역할을 합니다.
- 바깥쪽 mysite 폴더(이름 변경한 것)
바깥에 위치한 mysite폴더는 루트(root) 폴더입니다. 이 프로젝트를 진행하는 동안 뿌리와 같은 역할, 즉, 기반이 됩니다. 프로젝트에 대한 내용이 담기는 컨테이너라고 볼 수 있습니다. 루트 폴더의 이름은 언제든지, 무엇으로든지 바꿀 수 있습니다.
manage.py
장고를 이용하는 프로젝트를 다양한 방식으로 사용할 수 있도록 도와줍니다. 아래 링크에서 더 자세하게 확인하실 수 있습니다. django-admin and manage.py
안쪽 mysite 폴더
안쪽의 mysite 폴더는 우리의 프로젝트를 위한 실질적인 파이썬 패키지입니다. 이 폴더의 이름은 이 안에 있는 것들을 불러올 때 사용되기 때문에 변경하지 않는 것이 좋습니다.
안쪽 mysite 폴더 안의 __init__.py
이 파일은 비어있습니다. 파이썬에게 이 폴더(안쪽 mysite)가 파이썬 패키지라는 것을 알려주기 위해 존재할 뿐입니다. 파이썬에 대해 더 알고 싶다면 다음 링크를 참고하세요. more about packages
안쪽 mysite 폴더 안의 settings.py
이 프로젝트에 대해 설정하는 파일입니다. 설정하는 방법에 대해서는 다음 링크를 참고하세요. Django settings
안쪽 mysite 폴더 안의 urls.py
이 프로젝트의 URL이 동작할 수 있도록 등록해두는 파일입니다. 프로젝트안에 들어있는 내용(contents)들이 이름을 올려놓는 기록장이랄까요. URLs에 대해 더 자세한 내용은 다음 링크를 참고하세요. URL dispatcher
안쪽 mysite 폴더 안의 wsgi.py
우리의 프로젝트(=서비스)를 사람들에게 제공하기 위해 웹 서버로 들어가는 시작점입니다. WSGI = Web Server Gateway Interface. 위키백과에 따르면, '웹 서버와 웹 어플리케이션(기능)의 접점을 위한 파이썬 프레임워크' 라고 합니다. 더 자세한 내용은 다음 링크를 참고하세요. How to deploy with WSGI
(2) 개발용 서버 만들기
2.3.2__The development server
개발용 서버를 만들어 보겠습니다.
우리의 장고 프로젝트가 제대로 작동하는지 알고 싶습니다. 앞의 내용을 모두 진행했다면, 아래 명령어를 입력해 개발용 서버에서 프로젝트를 열어보겠습니다.
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.
October 04, 2016 - 15:50:53
Django version 1.10, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
이 개발용 서버는 모두 파이썬으로만 작성된 가벼운 서버입니다. 이 서버를 통해 우리는 유료 서버를 이용하지 않고 개발을 빠르게 진행할 수 있습니다. 프로젝트가 완성된 후에는 이 서버를 이용하시면 안됩니다. djangoproject.com이 제공하는 건 웹 서버가 아닙니다. 웹 프레임워크 입니다.
이제 서버를 작동시켜 보겠습니다. 터미널에 나타난 내용 중에서 http://127.0.0.1:8000/을 인터넷 주소창에 입력합니다. "Welcome to Django" 라고 적힌 페이지가 나타날 것입니다.
이 주소 중 8000은 포트를 나타냅니다. 포트는 개발용 서버를 여는 명령어를 입력할 때 변경할 수 있습니다. 아래와 같이 입력하면 포트가 8080으로 바뀝니다.
python manage.py runserver 8080
서버의 IP를 바꿔서 다른 사람들에게도 공개하고 싶다면 다음과 같은 명령어를 입력합니다.
python manage.py runserver 0.0.0.0:8000
개발용 서버에 대한 자세한 내용은 다음 링크에서 참고하세요. runserver
개발용 서버는 알아서 계속 새로고침 됩니다. (프로젝트의 변경사항이 반영됩니다.) 하지만 간혹 자동으로 반영되지 않는 내용들이 있습니다. 그럴 때는 직접 서버를 다시 시작해야 합니다.
(3) 앱 추가하기
2.3.3__Creating the Polls app
투표를 하는 기능(application)을 만들어 보겠습니다.
개발용 서버에서 우리의 프로젝트가 움직이기 시작했습니다. 이제 프로젝트에 기능을 추가해보겠습니다.
우리가 장고에서 만들 모든 기능들은 아주 정확한 관습에 따르는 파이썬 패키지로 구성됩니다. 기능을 구현하기 위한 기본적인 폴더의 구조는 장고가 제공합니다. 따라서 우리는 폴더를 만드는 것보다 코드를 짜는데 집중할 수 있습니다.
우리가 만들 모든 기능들은 파이썬이 작동하는 곳에서만 살아움직입니다. 이 말은, 기능(application)이 추가되는 위치가 manage.py 파일이 들어있는 폴더 안 이어야 한다는 뜻입니다. '투표'기능(application)을 '안쪽 mysite'폴더 안에 추가하면 안됩니다.
*윈도우로 넘어가서 이미지 추가할 것
새로 추가하는 앱(=기능)은 반드시 manage.py 와 같은 폴더에 있도록 만들어야 합니다. cd ..
(상위폴더로 이동) 등을 이용해 올바른 위치로 이동한 후 터미널에 명령어를 입력합니다.
python manage.py startapp polls
이 명령어는 polls라는 폴더를 만듭니다.
startapp 명령은 polls 폴더와 그 안에 자동으로 아래와 같은 파일들을 만듭니다.
__init__.py
admin.py
apps.py
migrations
models.py
tests.py
views.py
위와 같은 파일들은 polls라는 기능(= application. 앞으로 '앱'으로 통일하겠습니다.)의 뼈대를 형성합니다. 다른 어떤 기능을 추가하더라도 그 기능의 폴더안에는 위와 같은 파일들이 들어있습니다.
(4) 뷰 만들기
Write your first view
view를 만들어 보겠습니다.
장고는 MTV구조입니다.
*윈도우로 넘어가서 이미지 추가할 것
이 중 V를 담당하는 view 입니다. view는 각 앱 안에 들어있는 views.py에서 설정할 수 있습니다.
일단 앞으로 진행하게 될 프로젝트 구성에 대해 빠르게 큰 줄기를 훑어보겠습니다.
- 우리는 지금까지 프로젝트를 만들고, 그 안에 앱을 추가하고, 이 프로젝트가 동작할 개발용 서버를 열었습니다.
- 앱에 뷰를 추가한 다음, 이 뷰에 대해 앱 안의 urls.py에 등록합니다.
- 루트폴더의 urls.py 에 앱의 urls.py를 등록합니다.
- 데이터베이스를 설정합니다.
- 앱의 model을 설정합니다.
- API를 이용합니다.
- 장고의 관리자모드에 대해 알아봅니다.
우리는 지금 2번, 뷰를 만드는 중입니다.
이제 view를 만들어 보겠습니다.
polls 폴더 안의 views.py를 엽니다. 그리고 그 안에 다음과 같은 파이썬 코드를 씁니다.
# 작성위치 : polls 폴더 안의 views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
우리가 입력한 것은 장고에서 뷰에 사용할 수 있는 가장 단순한 코드입니다.
(image test)
(image test 2)
뷰가 잘 작동하게 하려면 우리는 뷰에 대한 주소(URL: Uniform Resource Locator)를 등록해 두어야 합니다. 주소를 통해 각각의 파일을 연결하는 과정이기 때문에 맵핑한다 고 부르기도 합니다. 또는 map을 만든다-라고 표현합니다. 이 작업을 위해 우리는 URLconf가 필요합니다. (conf = configuration: 구성)
polls 폴더 안에 urls.py 라는 파일을 만듭니다. 이 파일은 polls 폴더에 들어있는 파일들의 주소(url)를 관리할 것이므로, URLconf(configuration)라고 부르기도 합니다.
*윈도우로 넘어가서 폴더에 추가된 이미지 첨부
polls폴더의 urls.py 파일에는 다음 내용이 들어가야 합니다.
# 작성위치 : 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 하고, urlpatterns 목록에 include()를 집어넣습니다. 그러면 mysite/urls.py 의 코드는 아래와 같은 모양이 됩니다.
# 작성위치 : 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()함수는 다른 URL관리자(URLconf)를 참조할 수 있도록 도와줍니다. include()함수를 위한 정규표현식에 $가 없다는 것을 기억합시다. ($는 문자열의 끝을 의미하는 정규표현식 문자입니다.) 대신 슬래시가 있다는 점도 기억해주세요.
# polls/urls.py의 url 기록방식
url(r'^$', views.index......)
# mysite/urls.py의 include함수과 url
url(r'^polls/', include('polls.urls')),....)
장고가 주소(url)를 찾다가 includ()와 만나면 일치하는 부분을 찾을 때까지 URL을 뒤집니다. 적절한 것을 찾으면 가지고 있던 문자열을 그 URL로 보내어 전체 프로세싱을 완료합니다.
include()는 URL들을 다루기 편하게 도와줍니다. polls폴더 주소가 자기 자신의 url관리자(polls/urls.py)안에 등록되면, 그것들은 "/polls/", "/fun_polls/", "/content/polls/", 등 그 어떤 루트 패스아래에 있어도 찾을 수 있습니다.
언제 include()를 사용하나요?
include()는 다른 URL패턴을 포함할 때만 사용합니다. admin.site.urls는 유일하게 이 규칙에서 제외됩니다.
다시 말하면, mysite/urls.py에서 include()는 다른 폴더의 urls.py 즉, 개별 url이 아닌 url패턴(묶음)을 연결할 때만 사용해야 합니다. 일반 url을 등록할 때는 사용하면 안됩니다. admin site의 url을 등록하는 admin.site.urls만이 예외입니다.만약 mysite/urls.py에 include(admin.site.urls)라고 적혀있다면, 아마 장고의 버전이 이 튜토리얼과 다를 것입니다.
이제 우리는 index view를 URL관리자(URLconf)에 연결했습니다. 개발용 서버를 실행하여 제대로 동작하는지 확인해 봅시다.
$ python manage.py runserver
http://localhost:8000/polls/를 브라우저에 입력합니다. "Hello, world. You're at the polls index."라는 문장이 나타날 것입니다. 우리가 index view에 저장해 둔 내용이지요.
이 url() 함수는 총 네 개의 인수들에게 전달됩니다. 그 중 regex와 view에는 반드시 전달되어야 하며, kwargs와 name은 선택사항입니다. 이 네가지 인수가 무엇을 의미하는지 짚고 넘어가는 것이 좋겠습니다.
url() argument : regex
"regex"란 정규표현식 "regular expression"의 약자입니다. 문자열안에서 패턴을 매칭하는 문법이지요. 여기서는 url패턴을 매칭하는데 사용됩니다. 장고는요청된 URL을 찾을 때까지 첫번째 정규 표현식 부터 읽어내려가기 시작합니다.
주의 : 이 정규표현식들은 GET과 POST 파라미터(매개변수)를 찾아주지 않습니다. 도메인 이름 역시 찾아주지 않습니다. 예를 들어 https://www.example.com/myapp/ 이라는 요청이 들어오면 URL관리자는 myapp/을 검색할 것입니다. https://www.example.com/myapp/?page=3라는 요청이 들어와도 역시 myapp/을 검색합니다.
정규표현식의 도움이 필요하다면 위키피디아 엔트리와 re모듈에 대한 문서를 참고하십시오. O'reilly의 책인 "Mastering Regular Expression" by Jeffrey Friedle 도 훌룡합니다. 하지만 정규표현식의 대가가 될 필요는 없습니다. 간단한 패턴을 어떻게 읽어내는지만 알면 됩니다. 사실 복잡한 정규표현식은 검색에 별로 뛰어나지 않습니다. 정규표현식에 모든 것을 의지하지 맙시다.
마지막으로 퍼포먼스를 위한 주의사항입니다. 이 정규표현식들은 URL관리자 모듈(urls.py)을 처음 불러올 때 컴파일(오류검사) 됩니다. 이 과정은 정말 빠릅니다.
만약 검색이 위에서 말한 것처럼 너무 복잡하지 않다면 말입니다.
url() argument: view
적절한 url을 찾으면 장고는 그에 맞는 특정한 view 함수와 첫번째 인수로써 HttpRequest 객체, 그리고 모든 정규표현식에 "캡쳐"된 변수를 불러옵니다.만약 정규표현식이 간단한 캡쳐를 사용한다면, 값들은 위치인수(positional arguments)로 전달됩니다. 만약 캡쳐가 named 방식이라면 값들은 키워드인수(keyword arguments)로 전달됩니다. 조만간 이 부분을 다루게 될 것입니다.
url() argument: kwargs
임의의 키워드 인수는 지정된 뷰의 딕셔너리에 전달됩니다. 이 튜토리얼에서는 사용하지 않는 특성입니다.
url() argument: name
URL에 이름을 지어서 장고 어디에서든 찾을 수 있게 합니다. 템플릿에서라도 말입니다. 이 강력한 특징은 단 하나의 파일을 수정해서 프로젝트 전체의 URL 패턴을 바꿀 수 있게 해줍니다.