장고를 설치하려는 가상환경의 위치에서 pip install Django
명령어로 간단하게 설치할 수 있다.
python3 -m django --version
명령어로 설치된 Django의 버전을 확인할 수 있다.
만약 설치가 제대로 되지 않았다면, "No module named django"와 같은 에러가 발생한다.
django-admin startproject mysite
mysite
폴더를 생성한다.
- 프로젝트를 생성할 때,
django
나test
같이 python이나 django에서 사용되는 이름은 사용하면 충돌이 발생하기 때문에 주의해야 한다.- 작성한 코드는
/home/mycode
와 같이 웹 서버의 DocumentRoot 밖에 있는 것이 좋다. 그렇지 않으면, 외부 사람들이 파이썬 코드를 열어볼 수 있다.
mysite
폴더는 원하는 이름으로 바꾸어도 상관없다.python3 manage.py runserver
경고부분은 무시해도 된다.
순수히 파이썬으로 작성된 경량 웹서버인 장고 개발 서버를 시작했다. 우리는 웹 서버를 만드는 게 아니라 웹 프레임워크를 만들 것 이기 때문에 이 서버는 운영 환경에서는 사용되면 안되고 개발환경에서만 사용되어야 한다.
http://127.0.0.1:8000/ 로 들어가 보면 서버가 잘 동작하는 걸 확인할 수 있다.
기본적으로 runserver
명령은 내부 IP의 8000
번 포트에서 동작한다.
예를 들어 이 포트를 8080
으로 바꾸고 싶다면 다음과 같은 명령어를 입력하면 된다.
python manage.py runserver 8080
서버의 IP를 변경하려면 포트와 함께 전달하십시오. 예를 들어, 사용 가능한 모든 공용 IP를 청취하려면 (이는 Vagrant를 실행 중이거나 네트워크의 다른 컴퓨터에서 작업하고 싶을 때 유용합니다) 다음을 사용하십시오.
서버의 IP를 변경하려면 포트와 함께 입력해야 한다.
사용 가능한 모든 공용 IP를 청취(listen)하려면 다음 명령어를 입력하면 된다. (Vagrant를 사용하거나 네트워크상의 다른 컴퓨터에 작업내용을 보여주려 할 때 유용함)
python manage.py runserver 0:8000
0 은 0.0.0.0 를 줄인 것이다. 이에 관한 문서는 runserver reference에서 참조할 수 있다.
필요할 때, 각 request에 대한 파이썬 코드를 개발 서버가 자동으로 다시 불러온다. 코드를 적용하기 위해서 서버를 재시작할 필요가 없다. 하지만 파일을 더하는 등의 행위는 자동으로 다시 불러오지 않으므로 이런 경우에는 수동으로 서버를 재시작해야 한다.
이제 작업을 위한 환경이 설정되었으니, 이제 본격적으로 시작할 수 있다.
장고에서 작성하는 각 앱은 특정 관습을 따르는 파이썬 패키지로 이루어져 있다. 장고에는 앱의 기본 디렉토리 구조를 자동으로 생성하는 유틸리티가 딸려오기 때문에 디렉토리를 만드는 것 보다 코드 작성에 더 집중할 수 있다.
프로젝트와 앱의 차이는?
앱은 웹블로그 시스템이나 지금 만들려는 설문조사 앱 같은 웹 어플리케이션이고 프로젝트는 특정 웹 사이트에 대한 구성 및 앱의 모음이다. 프로젝트 하나가 여러 앱을 포함할 수도 있고, 한가지 앱이 여러 프로젝트에 포함될 수 있다.
앱은 python path
어느 곳에 있어도 상관없다. 이 튜토리얼에서는 manage.py
파일과 같은 디렉토리에 설문조사 앱을 만들 것이기 때문에 myside
의 submodule
이 아니라, 이 자체의 top-level module
로 임포트될 수 있다.
앱을 생성하기 위해 manage.py가 존재하는 디렉토리에서 다음의 명령을 입력해 보자.
python3 manage.py startapp polls
!
polls
폴더가 생성되었고 이 폴더 안에는 위와 같은 파일이 들어있다.
이 디렉토리에 설문조사 앱을 보관하게 된다.
polls
폴더에 views.py
파일을 열어서 다음과 같은 파이썬 코드를 작성해보자.
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
이것이 장고에서 가장 심플한 뷰이다. 뷰를 호출하기 위해서는 URL에 map
해야 하는데 이때 URLconf
가 필요하다.
polls
디렉토리 안에 URLconf
를 생성하기 위해서 urls.py
라는 이름의 파일을 생성해야 한다.
urls.py
에는 다음과 같이 작성하면 된다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
다음으로, root URLconf
가 django.urls.unclude
를 가르키게 한다. mysite/urls.py
에 import for django.url.include
를 추가하고, urlpatterns
리스트에 include()
함수를 넣어준다.
polls/urls.py 가 아니라 mysite/urls.py 이다!
include()
함수는 다른 URLconf
를 참조할 수 있게 해주는 함수이다. Django가 include()
함수를 만날 때마다, 그 URL의 일치하는 부분까지 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include 된 URLconf
로 보낸다.
이런 개념이 URL에 연결하기 쉽게 만든다. polls 앱이 이 자체의 URLconf(polls/urls.py
)에 있기 때문에, "/polls/", "fun_polls/", "/content/polls" 등 어떠한 root 경로에 있어도 앱은 문제없이 작동할 것이다.
admin.site.urls
를 제외하고 다른 URL패턴을 을 포함할 때마다 사용해야한다.이 과정을 끝으로 index
뷰가 URLconf
에 연결되었다. 확인하기 위해 다음 명령어를 입력해보자.
python3 manage.py runserver
http://localhost:8000/polls/ 로 이동해보면 다음과 같이 표시된다.
다음과 같은 페이지가 표시된다면 주소를 다시 확인해보자!
path()함수는 필수 인자 route
, view
2개와 필수가 아닌 kwargs
와 name
2개에 전달된다.
path(route, view, kwargs=None, name=None)
위의 4가지 인수에 대해 알아보자.
route
는 URL 패턴을 가진 문자열이다. 요청이 처리될 때, Django 는 urlpatterns
의 첫 번째 패턴부터 시작하여, 일치하는 패턴을 찾을 때까지 요청된 URL 을 각 패턴과 리스트의 순서대로 비교합니다.
패턴들은 GET
이나 POST
의 매개 변수들, 혹은 도메인 이름을 검색하지 않는다. 예를 들어, https://www.example.com/myapp/ 이 요청된 경우, URLconf
는 오직 myapp/
부분만 바라본다. https://www.example.com/myapp/?page=3, 같은 요청에도, URLconf
는 역시 myapp/
부분만 신경 쓴다.
Django 에서 일치하는 패턴을 찾으면, HttpRequest
객체를 첫 번째 인수로 하고, 경로로부터 '캡처된' 값을 키워드 인수로 하여 특정한 view
함수를 호출한다.
임의의 키워드 인수들은 목표한 view
에 사전형으로 전달된다. (이 튜토리얼에서는 사용되지 않는다.)
URL 에 이름을 지으면, 템플릿을 포함한 Django 어디에서나 명확하게 참조할 수 있다. 이 강력한 기능을 이용하여, 단 하나의 파일만 수정해도 project 내의 모든 URL 패턴을 바꿀 수 있도록 도와준다.