본문 바로가기
Research/Django

[Django] 공식 튜토리얼 1 정리

by RIEM 2021. 11. 2.
728x90

Django 공식 튜토리얼 1 정리

작성일 : 2021-11-02

 

레퍼런스

 

프로젝트 개요

장고(Django) 학습을 위해 공식 홈페이지의 튜토리얼을 참고해서 학습을 진행해보자. 이번 튜토리얼에서 만들 것은 바로 투표앱이다. 내가 선호하는 후보를 선택하면 그 후보의 투표값이 올라가는 그 투표를 말한다! 여기서 투표앱은 두 부분으로 구성되어 있다.

 

투표앱의 구성

  1. 파트 하나, 하나는 사람들이 투표결과를 보고 투표를 할 수 있는 public site
  2. 파트 둘, 당신이 투표 정보를 추가하고, 수정하고 삭제할 수 있는 admin page



> 프로젝트를 시작하기 전에 내 컴퓨터에 장고가 설치되어있는지 확인해보자.input

$ python -m django --version  #장고 버전 확인

output

3.2.6 버전이 설치되어있는 것을 확인할 수 있다! 설치되어 있지 않은 경우 “No module named django”라는 문구가 뜬다고 한다.

 

참고사항

이 튜토리얼은 Django 버전 3.2, Python 버전 3.6 이상 버전으로 작성되었다고 한다. 만약 이전 버전을 사용한다면 새로운 버전으로 업데이트할 필요 있다. 이제 본격적으로 프로젝트를 진행해보자!

 

프로젝트 만들기

장고 장고 프로젝트는 데이터베이스 configuration, 옵션, 세팅 등 장고의 instance를 위한 세팅들을 포함하고 있다. 이러한 장고 프로젝트를 자동으로 생성시키는 코드들을 손쉽게 자동으로 사용할 수 있다. 

> 우선 `cd` 명령어로 django 프로젝트를 실행하고 싶은 디렉토리로 가보자.input

$ django-admin startproject mysite 

‘Mysite’라는 이름의 장고 프로젝트를 생성하라

output

 ‘Mysite’라는 폴더 내 많은 파일들이 뚝딱 만들어졌다. 장고 공식 문서에서는 프로젝트 명을 django 또는 test와 같이 프로그램 내부 기능명과 충돌될만한 명칭은 피하라고 권유한다. 자, 만들어진 파일들이 무엇인지 아래 확인해보자.

 

$ tree /a /f

\---mysite
    |   manage.py
    |  
    \---mysite
            asgi.py
            settings.py
            urls.py
            wsgi.py
            __init__.py

 

생성된 파이썬 파일은 총 6개이고 그중 5개는 ‘mysite’내에 포함되어 있다. 각자 파일들에 대해 간단히 알아보자.

 

  • mysite/ root directory : 장고 프로젝트의 전체를 담고있는 용기다. 이름은 우리 맘대로 정하면 되겠다.
  • Manage.py : 우리가 장고를 요리조리 조작할 수 있도록 해주는 명령어 파일이다.
  • mysite/ inner directory : 위에 보면 mysite 루트 디렉토리 내에 5개의 파일을 담고있는 mystie 폴더가 하나 더 있다. 지금 설명하는 폴더는 하위 폴더를 지칭한다. 이 폴더는 프로젝트를 위한 파이썬 패키지라고 보면 되겠다. 폴더 이름은 파이썬 패키지를 불러올 때 함께 부르곤 한다. (e.g. mysite.urls)
  • mysite/__init__.py : 이 파일은 비어있는 파일인데, 파이썬 패키지라고 파이썬에게 알려주는 기능을 하는 파일이다. 상세한 내용은 파이썬 공식 문서를 참고해보라.
  • mysite/settings.py : 우리가 만든 장고 프로젝트의 Settings/configuration이다. 이 프로젝트의 환경설정이 어떻게 되어있는지 알려주는 파일이라고 보면 되겠다.
  • mysite/urls.py : 장고로 생성된 사이트의 자료 테이블을 선언하는 파일이다. 위치가 어디있는지 알려주는 것이라 보면 되는 걸까? 아직까지는 감이 오지 않는다.
  • mysite/asgi.py : 프로젝트에서의 ASGI-compatiable web servers을 위한 파일이라 한다. 공식문서를 좀 더 찾아보니, 장고는 ASGI를 이용할 수 있다고 나와있다. ASGI는 asynchronous web server and application라 한다. 음. 무슨 말을 하고싶은 걸까?
  • mysite/wsgi.py : 프로젝트에서의 WSGI-compatiable web servers을 위한 파일이라 한다. WSGI는 Python standard for web servers and aplications의 약자다. ASGI와 함께 서버를 위한 파일인 것으로 추정된다.

 

머리에 온도가 올랐다. 일단 잠깐 쉬고 오겠다.

 

서버 실행하기

자, 파일을 세팅했으니 그 파일로 서버를 실행해보자! 

input

$ python manage.py runserver

Output

뭐가 떴는데 길어서 잘 안보인다. 확대해보자.

드디어 장고 개발 서버를 막 시작했다. 순수한 파이썬으로만 작성된 가벼운 웹 서버다. Apache와 같은 서버 개발 환경설정없이도 장고를 이용하면 빠르게 서버를 개발할 수 있다. 적용되지 않은 migrations들이 있다는 문구가 뜨지만, 그 외 문구는 특별한 문제가 없어 보인다. 

 

장고 공식문서에 따르면 production environment와 유사하게 서버를 사용하지 말라고 한다. 즉, 개발할 때만 활용하라고 한다. 이 서버는 웹 프레임워크를 만들기 위함이지 웹 서버가 아니기 때문이다. 

 

지금 서버가 돌아가고 있다. 위에 문구에 적힌 ‘http://127.0.0.1:8000/’를 웹 브라우저에 입력해보자. 여기서 ‘8000’은 내부 IP 포트를 지칭한다. 서버 포트를 바꾸고 싶다면 아래처럼 작성하면 된다.

$ python manage.py runserver 8080
$ python manage.py runserver 0:8000



위 주소로 들어가면 이런 화면이 뜬다.

장고로 만든 웹 사이트가 성공적으로 만들어졌다는 축하 문구다. 프로젝트를 위한 준비는 끝났다. 이제 투표앱 만들기를 본격적으로 진행해보자.

 

투표앱 만들기(Creating the Polls app)

각각의 앱은 파이썬 패키지로 구성되어있다. 장고는 앱의 기본 디렉토리 구조를 자동으로 생성하는 기능을 가지고 있어서 디렉토리 대신 코드 작성에 집중할 수 있도록 도와준다. 

Project와 App의 차이점

여기서 잠깐 프로젝트와 앱의 차이점에 대해 알아보고 가자. 앱은 말그대로 무언가를 할 수 있게 하는 웹 어플리케이션을 의미한다. 웹블로그, 기록 데이터베이스, 투표 앱과 같은 것들 말이다. 프로젝트는 다양한 앱들과 환경설정을 포함하고 있다.

 

앱들은 Python path를 통해 어디에나 저장할 수 있지만 이번 튜토리얼에서는 manage.py 파일과 같은 디렉토리에 저장하자. mysite 라는 서브모듈이 아니라 탑레벨 모듈에 둔다고 생각하면 되겠다.


> 아래 명령어로 앱을 생성해보자input

$ python manage.py startapp polls

Output

polls 폴더와 sqlite 데이터베이스 파일도 함께 생겼다. 트리구조를 확인해보자.

 

$ tree /a /f

C:.
|   db.sqlite3
|   manage.py
|
+---mysite
|   |   asgi.py
|   |   settings.py
|   |   urls.py
|   |   wsgi.py
|   |   __init__.py
|   |
|   \---__pycache__
|           settings.cpython-38.pyc
|           urls.cpython-38.pyc
|           wsgi.cpython-38.pyc
|           __init__.cpython-38.pyc
|
\---polls
    |   admin.py
    |   apps.py
    |   models.py
    |   tests.py
    |   views.py
    |   __init__.py
    |
    \---migrations
            __init__.py

 

Django Architecture

첫번째 view 를 작성하기전에 장고의 프에임워크의 구조를 알아보자. 장고는 MVT모델을 가지고 있다. 

View 작성하기

첫번째 view를 간단히 작성해보자. 

> polls/views.py 파일 열고 아래 코드를 추가해보자

from django.http import HttpResponse

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

 

View 작성을 완료했다. 그렇다면 어떻게 View를 불러올 수 있을까? 이를 위해서 View와 URL을 매핑해주는 URLconf가 필요하다. 

URLconf를 polls 디렉토리에 만들기 위해선, ‘urls.py’이라는 파일을 만들어야 한다. 

> urls.py 파일을 아래와 같이 추가해주자.

->

 

해당 파일에는 아래와 같은 코드를 넣자.

> polls/urls/py

from django.urls import path



from . import views # 현재 디렉토리 기준



urlpatterns = [

    path('', views.index, name='index')

]

Urls.py파일을 polls 디렉토리에 추가해줬고 그 파일 안에 위 코드를 넣어주었다. 이 다음엔 무엇을 해야할까? 바로 URLconf 루트를 polls.urls 모듈에 지정해주는 것이다. 

> mysite/urls.py에서 django.urls.include를 import하고 urlpatterns 리스트에 include()를 추가했다.

from django.contrib import admin

from django.urls import include, path



urlpatterns = [

    path('polls/', include('polls.urls'))

    path('admin/', admin.site.urls),

]

 

include() 함수는 다른 URLconf들을 연동할 수 있도록 allow해준다. include() 함수를 사용하면 URLs를 플러그 앤 플레이 방식으로 쉽게 활용할 수 있게 된다. Admin.site.urls를 예외로 제외하고는 URLpatterns를 참조할 때는 항상 include()함수를 사용한다.

 

자, 이제 index view를 URLconf와 연결시켰다. 이를 검증해보자.

input

$Python manage.py runserver


Output

http://127.0.0.1:8000/polls/ 주소로 들어가서 확인해보면 아래와 같이 나온다.

path() argument

path() 함수는 4개의 arguments를 패스하는데, route와 view는 필수고, kwargs와 name는 옵션이다. 이 argument들에 대해 간략히 알아보자.

 

path() argument: route

Route는 URL pattern을 포함하고 있는 string이다. Request를 처리할 때, 장고는 urlpatterns에서의 첫번째 패턴에서 시작한다고 한다. 리스트를 만들고 요청된 URL을 각각의 패턴들과 비교하는데, 매치되는 것을 찾을 때까지 지속한다고 한다.

 

패턴들은 GET과 POST 파라미터들이나 도메인 이름을 검색하지 않는다. 예를 들어 https://www.example.com/myapp/에 요청이 있을 경우, URLconf는 myapp/을 찾을 것이다. https://www.example.com/myapp/?page=3에 요청이 있을 경우, 역시 URLconf는 myapp/을 찾을 것이다.

 

path() argument: view

장고가 매칭되는 패턴을 찾을 때, 첫번째 argument로 HttpRequest 객체와 keyword arguments로서 route로부터 포착된 values들을 함께 특정한 view 함수를 호출한다.

 

path() argument: kwargs

Arbitrary keyword arguments들은 타겟 view에 딕셔너리 형태로 pass될 수 있다. 

 

path() argument: name

URL 이름을 통해 어디에서든 자료를 호출할 수 있다. 

 

728x90

댓글