Djangogirls 튜토리얼 따라 하기

Tomato·2019년 10월 16일
0

Projects

목록 보기
5/5

Djangogirls Tutorial

인터넷의 동작

  • 웹 사이트란 동영상, 음악, 사진 파일처럼 하드 디스크에 저장된 파일묶음과 같다. 웹 사이트가 일반 파일과 다른 점은 HTML이라는 코드가 들어 있다는 점이다.

  • HTML도 다른 파일과 마찬가지로 하드 디스크 어딘가에 저장되어야 하는데, 인터넷에서는 서버라는 특별한 컴퓨터를 사용한다.

  • 인터넷은 서버라는 컴퓨터가 연결된 하나의 네트워크이다. 어떤 한 컴퓨터에서 다른 컴퓨터에 도달하기 위해 많은 다른 기계들을 통과한다.

  • 주소창에 URL을 입력하는 것은 해당 주소로 편지를 써서 보내는 것과 같다. 이 편지(데이터 패킷)는 우체국(라우터)을 통해 전달된다.

  • 실제로는 우리가 생각하는 주소 대신 IP주소를 사용하는데, 컴퓨터는 DNS(도메인 주소 시스템)에 우리가 입력한 URL의 IP주소를 물어본다.

  • 또한 편지(데이터 패킷)에는 규칙이 필요하다. 이를 HTTP(Hypertext Transfer Protocol)라고 한다.

요약하면, 웹 사이트를 만들려면 웹 사이트가 동작할 서버가 필요하다. DNS를 통해 서버의 IP주소를 얻어 서버로 HTTP을 지킨 편지(데이터 패킷)를 보내면, 다시 다른 웹 사이트로 되돌려준다.

Django란 무엇인가?

Django는 파이썬으로 만들어진 무료 오픈소스 웹 애플리케이션 프레임워크이다. 쉽고 빠르게 웹 사이트를 개발할 수 있도록 돕는 구성요소로 이루어졌다.

  • 편지(request, 요청)가 도착했는지 확인해 주는 메일박스(port, 포트)가 있다고 하자. 이것은 웹 서버가 해 주는 일이다. 웹 서버는 받은 편지를 읽고 웹 사이트와 함께 답장을 준다. 그런데 무언가를 주고 싶을 때는 내용이 있어야 한다.

  • 장고는 이 내용, 특정 콘텐츠를 만드는 일을 한다.

  • 웹 서버에 요청이 오면 장고로 전달된다.
  • 장고 urlresolver는 웹 페이지의 주소를 가져와 무엇을 할지 확인한다.
  • 패턴 목록을 가져와 URL과 맞는지 대조해 식별하고, 일치하는 패턴이 있으면 해당 요쳥을 관련된 함수(view)에 넘겨 준다.
  • "이름을 바꿔 주세요" 라는 요청이 왔을 때 view 함수는 수정할 수 있는 권한이 있는지 확인 후 수정한 뒤 답장을 생성한다.
  • 장고는 그 답장을 사용자의 웹 브라우저에 보내 준다.

Django 프로젝트 시작하기

pip install django
  • 장고 설치가 끝나면 다음 명령어로 장고 프로젝트를 시작한다. 이는 장고의 기본 골격을 만들어 주는 스크립트를 실행한다.
django-admin startproject mysite .

가상 환경이 활성화되어 있어야 웹 서버가 실행된다.

  • 위 명령어를 실행한 결과로 생겨난 것들을 데이터베이스에 반영해 주기 위해서 터미널에 다음과 같이 입력한다. 이 과정을 거쳐야 웹 서버를 실행할 수 있다.

    python manage.py migrate
    python manage.py runserver

Django model

이제 블로그 내 모든 포스트를 저장하는 부분을 만든다. 이는 포스트라는 객체를 모델로 만듦으로써 가능하다.

  • 포스트는 제목과 내용 작성자, 작성 날짜, 게시된 날짜 등을 속성으로 가지고 글을 쓰는 메서드를 가진 객체이다.
  • 이를 장고에서는 모델로 만들어 데이터베이스에 저장한다.

우선, 블로그 포스트를 위한 별도의 애플리케이션을 장고 프로젝트에 생성한다.

python manage.py startapp blog

이후 장고에 이 애플리케이션을 사용할 것임을 알려 준다.

# mysite/settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]

모든 Model 객체는 models.py에 선언된다. 포스트 모델도 마찬가지이다. 모델의 필드와 정의 방법 등은 장고 공식 문서에 상술되어 있다. (장고 공식 문서)

#blog/models.py
from django.conf import settings
from django.db import models
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField(blank=True)
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    # instance method
    def publish(self):
        self.published_date = timezone.now()
        self.save()

    # magic method
    # if you call Post instance, you can see Post instance's title
    # and you can see it in Django-admin
    def __str__(self):
        return self.title
      ```
 
 새로운 모델을 만들었으니, 이를 데이터베이스에 추가해 줘야 한다.
 
 ```bash
 python manage.py makemigrations

위의 명령어를 입력하면 변화 사항을 볼 수 있다. 확인 후 이를 적용한다.

python manage.py migrate

Django 관리자

장고에는 관리자 화면이 만들어져 있다. 관리자 화면에서 새로 만든 모델을 시험해 볼 수 있다.

  • 그전에, 관리자 페이지에서 모델을 볼 수 있도록 등록해야 한다.
# blog/admin.py
from django.contrib import admin
from .models import Post

admin.site.register(Post)

웹 서버를 실행한 후 주소창 뒤에 admin을 추가하면 관리자 로그인 페이지를 볼 수 있다.

  • 로그인을 위해서는 superuser를 생성해야 한다. 이는 (프로젝트의 가상 환경이 실행되고 있는) 터미널에서 가능하다.
python manage.py createsuperuser

위의 명령어를 입력하고 사용자 이름과 이메일 주소와 암호를 입력하면 superuser가 생성된다.

Django urls

  • URL은 웹 주소를 의미한다.
  • 인터넷의 모든 페이지는 고유한 URL을 가진다.
  • 애플리케이션은 사용자가 URL을 입력하면 어떤 내용을 보여 줘야 하는지 알고 있다.
  • 장고는 미리 정의된 URL 목록을 가지고, 요청받은 URL과 일치하는 URL을 view와 대조해 찾아낸다.

웹 서버 실행시 가장 처음 나오는 페이지에서 글 목록을 보여 주기 위해 blog 애플리케이션에서 메인 mysite/urls.py 파일로 url들을 가져온다.

# mysite/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]

이제 장고는 웹 서버 실행시 가장 처음 나오는 페이지(http://127.0.0.1:8000/)로 들어오는 모든 접속 요청을 blog.urls로 전송할 것이다. 이제 blog/urls.py 파일을 만들어 전송된 접속 요청에 맞게 처리할 수 있도록 하자.

# blog/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name="post_list")
]

post_list라는 view가 할당되었다. 누군가 http://127.0.0.1:8000/로 들어오면 views.post_list를 보여 주어야 한다. name='post_list'는 URL에 이름을 붙인 것으로 뷰를 식별한다.

Django view

위에서 아직 뷰를 생성하지 않았으므로, 이제 뷰를 생성해 줘야 한다. 뷰(view)는 모델에서 필요한 정보를 받아 템플릿에 전달한다.

# blog/views.py
from django.shortcuts import render

def post_list(request):
    # post_list.html 파일을 render한 결과를 HttpResponse로 돌려준다.
    # rendering = 동적인 HTML 만드는 과정
    return render(request, 'post_list.html')

HTML 시작하기

위에서 뷰가 모델에서 필요한 정보를 받아 템플릿에 전달한다고 했는데, 템플릿이란 서로 다른 정보를 일정한 형태로 표시하기 위해 재사용 가능한 파일을 말한다. 장고 템플릿 양식은 HTML을 사용한다.

  • 템플릿 폴더를 따로 만들어 템플릿들을 관리하기 용이하게 한다.
  • 경로는 만드는 사람이 마음대로 설정해 줘도 되지만, 관리가 용이해야 한다.

템플릿 폴더를 만들었다면 장고가 그곳에서 템플릿을 찾도록 세팅을 바꿔 주어야 한다. 템플릿 폴더를 생성한 경로에 맞게 추가해 준다.

# mysite/settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

이제 템플릿 폴더에 템플릿인 HTML 파일을 만든다. 뷰는 post_list.html이라는 파일을 찾으므로, 파일명을 post_list로 설정해 준다.

# templates/post_list.html
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Post list</h1>
</body>
</html>

여기까지 완료하고 http://127.0.0.1:8000/로 접속하면 위의 HTML 소스에 맞게 화면이 표시될 것이다.

참고: MVC

  • MVC란 모델-뷰-컨트롤러(Model-View-Controller)의 약자로 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다.
  • 웹 개발에서 각각은 다음을 의미한다.
  • Model: 데이터(DB)
  • View: HTML
  • Controller: DB 데이터를 사용해서 동적 HTML 생성
  • 장고도 이 모델을 따른다. 다만 명칭에 차이가 존재한다. 장고에서는 MTV, 즉 모델-템플릿-뷰의 모델을 사용한다. 명칭만 다를 뿐 구조는 같다.
  • Model: 데이터(DB)
  • Template: HTML
  • View: Controller
profile
토마토는 맛있어

0개의 댓글