My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


쟝고(Django) 1편 밑바닥부터 시작하기

이 포스트는 Django 2버전을 기준으로 하여 작성되었습니다.

1) Django가 무엇인가?

1-1. Django

이전까지 배웠던 플라스크라는 프레임워크는 보시다시피

1

굉장히 작은 웹 프레임워크이며, 요청과 응답을 관리하는 핵심적인 기능들만 가지고 있다.

이번에 배울 쟝고는 소개에서도 보시다시피 플라스크보다 powerful한 프레임워크인데,

2

보통 어플리케이션이 커졌을 때 생기는 문제점들을 커버하기 위해서 더 큰 프레임워크로 갈아탄다고 한다.

실제로 http://hotframeworks.com/ 에 들어가보면, 쟝고가 파이썬 프레임워크 중에서는 제일 높은 랭킹을 가지고 있음을 알 수 있다.

3

우선 쟝고가 무엇인지에 대해서 알아보기 이전에, 왜 쟝고를 써야하는지에 대해서 알아보자.


1-2. 왜 Django가 필요한가?

웹사이트를 만드는 것은 어찌보면 요청과 응답을 관리하는 것이기 때문에 카페를 창업하는 것과 비슷하다고 볼 수 있다.

카페를 창업하는 방식도 프렌차이즈 방식과, 직접 창업하는 방식이 있듯이 웹도 두가지로 생각해볼 수 있다.

  1. 스스로 다 만들기 (직접 창업)

    -> 웹사이트를 스스로 만들려면 다음과 같은 기능을 다 직접 구현해야한다.

    • URL Parsing

    • DB setting, ORM (ex, SQLAlchemy)

    • Security

    • Content Management, Template (ex, Jinja)

    • Caching

    • Web server setting

    일단 뭔지 잘 모르겠다..

    웹은 요청과 응답으로만 이루어져있다면서 생각보다 할 것들이 엄청나게 많다.

  2. 프레임워크를 사용하기 (프렌차이즈)

    위의 기본적인 기능을 제공함. -> 매우 편리하다.

    그리고 프렌차이즈와 달리 수수료도 떼가지 않으니 프레임워크를 사용하지 않을 이유가 없다.

심지어 쟝고는 이런 프레임워크 중에서 가장 빡빡하게 많은 기능을 제공하기 때문에 아무것도 모르는 우리에게는 꼭 필요하다고 볼 수 있다.

그러면 쟝고가 어떤 식으로 우리의 웹페이지를 관리해주는지를 알아보도록 하자.


1-3. Overview

기존에는 Static page, 그러니까 깃헙 블로그같이 변하지 않는 페이지에 대해서,

  • Static page에 해당하는 url을 요청한다.
  • 웹서버가 해당하는 url에 html파일이 있는지 확인
  • 유저에게 보여줌

이런식으로 요청과 응답을 해주었는데

쟝고는 플라스크와 같이 Dynamic application을 만들 수 있다. (플라스크 상위호환)


쟝고는 M T V라는 아키텍쳐들로 이루어져있다.

11

  • M (Model) : 데이터를 관리

  • T (Template) : 사용자가 보는 화면

  • V (View) : 가장 중요함, M과 T사이에서 모든것을 통제하는 관리자

    (다른 프레임워크에서는 C, Controller로 불림.)

EX) 강의사이트

  • 1번강의를 보기 위해서 /lecture/1과 같은 URL 입력

    -> 문지기 (URL Dispatcher) 를 거침 -> View가 요청을 받음 -> Model에게 1번강의를 찾아달라고 함.

    -> Model이 DB에서 사용자가 요청한 데이터를 찾아서 View에게 전달함

    -> View가 Template에게 데이터를 잘 꾸며서 HTML파일로 보내줄 것을 명령함.

    -> Template가 HTML파일을 이용자에게 보내줌.

2) Django 환경설정 (Window)

2-1. 가상환경 설정

  1. Pyenv, Virtualenv를 설치해야함.

    • Pyenv : 컴퓨터 한 대에 여러 파이썬 버전을 설치할 수 있게 해줌, 그리고 이걸 관리해주는것.

      왜 하는가? 현업에서는 각자 관리하는 버전이 다르기때문

      보통 legacy code (프로젝트 관리)를 할 때와 새로운 프로젝트를 만들 때 쓰이는 파이썬 버전이 다르다.

      • 듀랑고 게임에서 서버에러가 났었는데 그 이유 중에서,

        처음에는 파이썬 2.7버전으로 개발을 했다가 후에 legacy code를 고칠 때 쓰이는 파이썬코드들이 3버전들이었던 것들이 많았기 때문이다.

    • 그러면 이런 파이썬 버전들이 무엇을 의미하는가?

      Semantic Versioning

      4

      • 버전 앞자리는 breaking change, 엄청 많이 변했음을 뜻한다.

        Incompatible API changes라는 말은 API change를 호환할 수 없음을 의미한다.

        ex) 파이썬 2점대와 3점대는 굉장히 다름 : print문이 함수가 아니라 예약어같은 기능을 했음.

      • 두번째자리는 backwards-compatible, 뒷버전은 앞버전을 호환할 수 있음을 의미함.

        그래서 신규버전에서 이전버전의 코드는 그대로 쓸 수 있지만, 이전 버전에서 신규코드는 쓸 수 없음.

        단적인 예로 3.6버전에서 f-string이 추가되었으며 딕셔너리도 순서를 보장받게 되었다.

    그렇기 때문에 쟝고 1버전을 다루는 책을 절대로 사면 안된다.

    현재는 2버전이며 업데이트된지 얼마 안되었기 때문에 상당히 1버전으로 다루어진 매체들이 많다.


    설치코드)

    git clone https://github.com/pyenv/pyenv.git ~/.pyenv # pyenv를 설치함.
       
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc # 환경변수 설정
       
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc # path 환경변수 등록
       
    echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
       
    exec "$SHELL" # shell 리로드
    
    git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv # pyenv-virtualenv를 설치
       
    echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
    exec "$SHELL"
    
  2. Pyenv를 통해서 python 3.6.7버전을 설치

    pyenv install 3.6.7
    
  3. 전역 버전에서 기본파이썬 버전을 3.6.7으로 만들어야함.

    pyenv global 3.6.7
    python --version
    >>> Python 3.6.7
    
  4. Virtualenv 설정

    • Virtualenv는 가상환경을 만들어주는 기능을 의미하는데,

      말 그대로 요 환경안에 들어가면 바깥세상과 단절되는 느낌을 선사한다.

      PRACTICE라는 폴더를 만들어서 이 폴더와 바깥세상을 완벽히 단절시켜보자.

    start666:~/workspace/PRACTICE $ pyenv virtualenv 3.6.7 practice-venv
    #practice-venv라는 가상환경을 만들겠다. venv = virtual environment의 약자
    

    그리고 가상환경속에 들어가는 명령어도 존재한다. (이건 강력한 명령어라서 PRACTICE 폴더에 들어가게 된다면 항상 이 가상환경에 접속하게된다.)

    start666:~/workspace/PRACTICE $ pyenv local practice-venv 
    (practice-venv) start666:~/workspace/PRACTICE $ 
    

    (practice-venv) 라는 표시가 뜨면서 가상환경내에 있다는 것을 알려준다.

    그리고 쟝고를 설치하고, pip list로 설치된 패키지들을 확인할 수 있다.

    pip instal django
    pip list
    >>>
    Package    Version
    ---------- -------
    Django     2.1.7  
    pip        10.0.1 
    pytz       2018.9 
    setuptools 39.0.1 
    

2-2. 프로젝트 생성

PRACTICE라는 폴더 안의 가상환경에서 프로젝트를 만들어보자.

  • 쟝고에는 프로젝트를 전부 관리해주는 좋은 시스템을 만들 수 있다.

    (practice-venv) start666:~/workspace/PRACTICE $ django-admin startproject practice .
    

    변화는 없지만 practice 폴더에 많은 것들이 생성되었음을 알 수 있다.

    (practice-venv) start666:~/workspace/PRACTICE $ tree .
    .
    ├── manage.py
    └── practice
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
      
    1 directory, 5 files
    
  • init.py : 이것들을 하나의 쟝고 패키지로 만들어주는 역할

  • settings.py와 urls.py가 주로 우리가 다룰 것이다.

  • wsgi.py : 나중에 페이지를 배포할 때 필요함.

  • manage.py : 파이썬 쟝고에게 스크립트들을 매길 수 있는 기능들. 직접적으로 건드리지는 않지만 많이 불러와서 사용함.

2-3. 서버 구동하기

  • manage.py를 통해서 시행가능함.

    (practice-venv) start666:~/workspace/PRACTICE $ python manage.py runserver $IP:$PORT
    

    runserver : 서버를 돌아가게 하는 인자들 중 하나.

    $IP,$PORT : 아이피와 포트를 가지고있는 변수.

    start666:~/workspace $ echo $IP
    0.0.0.0
    start666:~/workspace $ echo $PORT
    8080
    
  • 그래서 생성된 서버에 들어가보면

    5

    이런 메시지가 뜰 것이다.

    쫄지말고 읽어보면 단순히 우리 호스트(주소)를 다시 ALLOWED_HOSTS에 넣으라는 이야기다.

    settings.py 에서 이러한 것들을 관리할 수 있다고 한다.

  • setting.py : 쟝고를 위한 모든 configuration들이 담겨져있는 파일임.

    ... (생략)
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
      
    ALLOWED_HOSTS = ['djangopractice-start666.c9users.io']
    ... (생략)
    
  • 이걸 추가했더니 서버를 reload하지 않아도

    쟝고의 reloder가 변화를 자동으로 인식해서 변화를 감지한다!!!

    6

    그러면서 이런 로켓이 뜨면서 성공적으로 잘 된 것을 확인할 수 있습니다.

    (물론 그렇지만 설정파일을 건들때는 안전을 위해서 서버를 꺼두는게 좋다.)

2-4. 한국에 맞는 세팅으로 바꾸기

한국 시간 기준과, 한국어 버전을 위해서 settings.py을 간단하게 수정해보자.

# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE = 'ko-kr' # en-us (미국영어) -> ko-kr

TIME_ZONE = 'Asia/Seoul' # UTC -> Asia/Seoul

USE_I18N = True

USE_L10N = True

USE_TZ = True

7

이런 식으로 쟝고는 internationalization ( i18n, 하나의 앱에서 다양한 언어를 지원) 기능을 지원하기 때문에 여러 국가의 언어를 사용할 수 있다.

3) 간단한 앱 만들기

우리는 여태껏

  1. PRACTICE라는 폴더 안에 가상환경을 만들었고,
  2. 가상환경 안에 practice라는 프로젝트를 만들었다.

쟝고에서는 프로젝트 하나에 여러 앱들을 만들어서 관리하기가 편하게 구성할 수 있다.

3-1. Blueprint

8

이런 project라는 폴더 안에 여러 어플리케이션을 만드는게 목적이다.

  • 앱 기본틀 만들기
(practice-venv) start666:~/workspace/PRACTICE $ python manage.py startapp pages

이제 pages라는 폴더에서 앱을 만들기 위해서 필요한 기본틀을 만들어주었다.

9

이전에 언급했던 매우 중요한 Views와 Models폴더가 여기 있습니다.

플라스크에서 app.py를 전부 썼지만 쟝고에서는 apps.py를 잘 안쓸거임.

그리고 이렇게 앱을 만들었으니, 쟝고가 우리 앱을 인식해야한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'pages', #추가됨, traling comma를 붙이는게 관례이다!
]

pages라는 앱을 설치했으니 다시 settings.py에 들어가서 INSTALLED_APPS 에 포함시키자.

(pages 폴더 안에 init.py가 있기 때문에 패키지처럼 인식된다.)

3-2. 앱 구성방법

전반적인 순서 : View -> Route -> Template 조작

플라스크로 앱을 만들 때 @app.route같은 명령어로 요청과 응답을 어떻게 처리할지에 대해서 얘기했는데,

쟝고로 앱을 만들때도 이러한 기능이 필요하다.

  1. < views.py >

    def index(request):
        return render(request, 'index.html')
    

    request라는 변수가 인자로 들어간다.( flask의 request 클래스와 비슷한 느낌이라고 생각하면된다. )

    역시나 플라스크처럼 templates 폴더 안에서 index.html 파일을 관리해주면된다.

  2. < urls.py >

    원래 View와 Template가 소통하기 이전에 URL Dispatcher라는 문지기를 거쳐야하는데 그런 역할을 practice 폴더의 urls.py가 해준다.

    우리는 페이지를 만들면 urls.py 에 명시적으로 “어떤 요청이 들어왔을 때 그 요청을 어디에 가져다 줄 것인가!” 를 지정해주어야한다.

    from django.contrib import admin
    from django.urls import path
    from pages import views
       
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', views.index)
    ] 
    # path(url, 해당 요청을 다룰 view의 함수)
    # root url은 ''라고 치면됨.
    

    index/ 라는 주소로 요청이 들어오면, views라는 파일에 index함수가 들어있으니 거기로 request를 보내주세요!

    그런데 practice폴더 입장에서는 views가 어디에있는지 모르므로 views의 존재를 from pages import views로 알려주어야한다.

    어플리케이션의 수가 많아지면 이렇게 route들을 분리하는게 편하다고 함.

3-3. Django 문법 적응하기

  1. Dynamic page 만들기

    우리가 플라스크에서처럼 python 변수를 다루기 위해서 따로 render함수의 매개변수로 넣어주었는데,

    쟝고에서도 비슷하게 해주면 된다. (다만 딕셔너리형태로 넣어주어야함!)

    def index(request):
        context = {'msg':'hello','name':'John'}
        return render(request, 'index.html',context)
    
    <!-- index.html -->
    <h1>First Diango!!</h1>
    <h2></h2>
    <h3></h3>
    

    10

    이제 파이썬 변수를 템플릿이 인식해서 성공적으로 출력을 해주었다.

  2. Variable routing

    ex) url을 통해서 받은 숫자를 세제곱해서 출력하는 함수

    from django.contrib import admin
    from django.urls import path
    from pages import views
       
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/',views.index),
        path('isval/',views.isval),
        path('cube/<int:number>',views.cube),
    ]
    

    먼저 라우트를 설정해준다. 플라스크와 똑같은 문법을 따르면 된다.

    cube 뒤에 붙은 url이 number라는 변수로 들어간다는 것을 알 수 있다.

    def cube(request,number):
        # 사용자로부터 url로 입력받은 값을 세제곱함.
        context = {'result':number**3}
        return render(request,'cube.html',context)
    
comments powered by Disqus