웹 사이트란 동영상, 음악, 사진 파일처럼 하드 디스크에 저장된 파일묶음과 같다. 웹 사이트가 일반 파일과 다른 점은 HTML이라는 코드가 들어 있다는 점이다.
HTML도 다른 파일과 마찬가지로 하드 디스크 어딘가에 저장되어야 하는데, 인터넷에서는 서버라는 특별한 컴퓨터를 사용한다.
인터넷은 서버라는 컴퓨터가 연결된 하나의 네트워크이다. 어떤 한 컴퓨터에서 다른 컴퓨터에 도달하기 위해 많은 다른 기계들을 통과한다.
주소창에 URL을 입력하는 것은 해당 주소로 편지를 써서 보내는 것과 같다. 이 편지(데이터 패킷)는 우체국(라우터)을 통해 전달된다.
실제로는 우리가 생각하는 주소 대신 IP주소를 사용하는데, 컴퓨터는 DNS(도메인 주소 시스템)에 우리가 입력한 URL의 IP주소를 물어본다.
또한 편지(데이터 패킷)에는 규칙이 필요하다. 이를 HTTP(Hypertext Transfer Protocol)라고 한다.
요약하면, 웹 사이트를 만들려면 웹 사이트가 동작할 서버가 필요하다. DNS를 통해 서버의 IP주소를 얻어 서버로 HTTP을 지킨 편지(데이터 패킷)를 보내면, 다시 다른 웹 사이트로 되돌려준다.
Django는 파이썬으로 만들어진 무료 오픈소스 웹 애플리케이션 프레임워크이다. 쉽고 빠르게 웹 사이트를 개발할 수 있도록 돕는 구성요소로 이루어졌다.
편지(request, 요청)가 도착했는지 확인해 주는 메일박스(port, 포트)가 있다고 하자. 이것은 웹 서버가 해 주는 일이다. 웹 서버는 받은 편지를 읽고 웹 사이트와 함께 답장을 준다. 그런데 무언가를 주고 싶을 때는 내용이 있어야 한다.
장고는 이 내용, 특정 콘텐츠를 만드는 일을 한다.
프로젝트를 시작하기 위해 우선 가상 환경을 설정한다. (pyenv와 pyenv-virtualenv를 사용한 파이썬 개발 환경 구성하기)
가상 환경 설정이 끝나면 다음 명령어로 장고를 설치한다
pip install django
django-admin startproject mysite .
가상 환경이 활성화되어 있어야 웹 서버가 실행된다.
위 명령어를 실행한 결과로 생겨난 것들을 데이터베이스에 반영해 주기 위해서 터미널에 다음과 같이 입력한다. 이 과정을 거쳐야 웹 서버를 실행할 수 있다.
python manage.py migrate
python manage.py runserver
이제 블로그 내 모든 포스트를 저장하는 부분을 만든다. 이는 포스트라는 객체를 모델로 만듦으로써 가능하다.
우선, 블로그 포스트를 위한 별도의 애플리케이션을 장고 프로젝트에 생성한다.
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
장고에는 관리자 화면이 만들어져 있다. 관리자 화면에서 새로 만든 모델을 시험해 볼 수 있다.
# blog/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
웹 서버를 실행한 후 주소창 뒤에 admin
을 추가하면 관리자 로그인 페이지를 볼 수 있다.
python manage.py createsuperuser
위의 명령어를 입력하고 사용자 이름과 이메일 주소와 암호를 입력하면 superuser가 생성된다.
웹 서버 실행시 가장 처음 나오는 페이지에서 글 목록을 보여 주기 위해 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에 이름을 붙인 것으로 뷰를 식별한다.
위에서 아직 뷰를 생성하지 않았으므로, 이제 뷰를 생성해 줘야 한다. 뷰(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을 사용한다.
템플릿 폴더를 만들었다면 장고가 그곳에서 템플릿을 찾도록 세팅을 바꿔 주어야 한다. 템플릿 폴더를 생성한 경로에 맞게 추가해 준다.
# 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 소스에 맞게 화면이 표시될 것이다.