Django 작동 방식(MVT 패턴)
먼저 urls.py
에서 연습을 위해 썼던 view함수
들을 views.py에 옯겨오겠다.
이번 포스팅에는 urls.py 파일
과 views.py
파일, templates 폴더의 html파일
을 연동시켜보겠다.
Django에서 urls.py
, views.py
, 그리고 템플릿(HTML)파일
들은 함께 작동하여 클라이언트에게 동적인 콘텐츠를 제공한다.
웹 어플리케이션이 클라이언트와 데이터를 주고 받을 수 있도록 특정 URL 경로를 만들고, 이 경로를 통해 클라이언트가 요청을 보내고 응답을 받을 수 있도록 설정하고 클라이언트에게 동적인 콘텐츠를 제공하는데 사용된다.
다음은 urls.py
, views.py
, 그리고 템플릿(HTML)파일
들을 간단하게 설명한 내용이다.
urls.py : URL 경로와 뷰 함수 간의 매핑을 정의
urls.py
파일은 클라이언트의 요청 URL을 분석하여 URL 패턴을 정의하고 해당 요청 URL 패턴을특정 View 함수 또는 클래스
와 연결한다.- URL 패턴은 특정 URL 경로에 대한 요청을 어떤 View 함수 또는 클래스로 보낼지 결정한다.
- 예를 들어, /home/ URL에 대한 요청은 views.home 함수와 연결할 수 있다.
views.py : View 함수 또는 클래스 정의
- 'views.py 파일은 View 함수 또는 클래스를 정의하고, 이러한 각각의 View 함수 또는 클래스는 클라이언트의 요청을 처리하고 그에 따른 응답(response)를 생성한다.
- 일반적으로 Python 함수로 구현되며, Django의 HttpResponse 객체를 반환하여 웹 페이지나 데이터를 클라이언트에게 제공한다.
- 요청을 처리하는 로직, 데이터베이스 액세스, 데이터 처리 등을 여기에서 구현한다.
- 요청에 따라 데이터를 가져오고, 데이터를 처리하고, 템플릿을 렌더링하여 동적인 HTML 페이지를 생성한다.
- 예를 들어, View 함수를 정의할 때
views.pingpong
은 특정 템플릿 HTML을rendering
하여 홈페이지를 생성하는 데 사용될 수 있다.
템플릿 HTML 파일
- View 함수 또는 클래스에서 전달된 데이터를 템플릿에 채워넣고, 클라이언트에게 동적인 HTML을 반환한다.
- 예를 들어,
'pong.html'
이라는 파일로 정의된 템플릿은views.pingpong
함수에서 render함수로 템플릿을 가져오도록 연결하여 클라이언트에게 요청한 URL에 이 템플릿(HTML)을 보여줄 수 있다.
templates 디렉토리
- Django Templates는 Django 웹 프레임워크에서 사용되는 템플릿 시스템으로, HTML과 Python 코드를 조합하여 동적인 웹 페이지를 생성하는 데 사용된다.
- Django Templates는 템플릿 상속을 지원하여 여러 페이지에서 공통 레이아웃을 재사용할 수 있다.
이제 클라이언트가 요청한 URL 패턴
에 연결된 View함수
와 template HTML 파일
을 연결하여 클라이언트에게 HTML 화면을 보여주자.
[pong.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pingpong Page</title>
</head>
<body>
<h1>pong</h1>
</body>
</html>
html 파일을 만들었다면 settings.py
의 Templates
부분에 html이 추가된 디렉토리를 추가해줘야한다.
[settings.py/TEMPLATES]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR/'basiclecture'/'templates'],
'APP_DIRS': True, # App을 만들면 App의 Templates 폴더는 자동으로 추가된다.
'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',
],
},
},
]
이제 views.py
의 pingpong(request)
함수를 render함수를 이용하여 pong.html
파일을 가져오도록 정의해보자.
from django.http import HttpResponse
from django.shortcuts import render
def pingpong(request) :
return render(request, 'pong.html')
작업 순서는 이렇다.
1) pong.html
탬플릿을 랜더링해서 클라이언트에게 보여줄 HTML 페이지을 생성한다.
2) 생성된 HTML 페이지를 HTTP 요청(request
)과 합쳐서 HTTP 응답(HttpResponse 클래스의 객체)으로 포장한다.
3) 이 응답(HttpResponse 클래스의 객체)을 클라이언트에게 반환하여 클라이언트가 브라우저에서 pong.html
페이지를 볼 수 있게 한다.
render
함수는 요청을 받아서, 각 설정 값을 입힌 응답을 반환한다.
서버를 실행하고 'ping/' url로 들어가보니 HTML에서 작성한 'title'과 내용이 보여진다.
이제 index(request)
함수도 템플릿을 만들어서 연결해보자.
[index.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>알렉스 인사</title>
</head>
<body>
<h1>하하!<h1>
<p>안녕하세요 알렉스입니다.</p>
</body>
</html>
[views.index]
from django.http import HttpResponse
from django.shortcuts import render
def pingpong(request) :
return render(request, 'pong.html')
def index(request) :
return render(request, 'index.html')
이제 'index/' views.py에 queryparam의 값들도 출력해주려면 장고 템플릿 언어 {{ }}
를 사용하여 html에 넣어주고 render함수
에 전달해주기 위해서 index(request)
함수 내에 context 딕셔너리
에 변수를 추가해준 후 render함수
에 context도 전달해준다.
[views.index]
from django.http import HttpResponse
from django.shortcuts import render
def index(request) :
context = {
'my' : request.GET.get("my"),
'name' : request.GET.get("name"),
'is_' : request.GET.get("is")
}
return render(request, 'index.html', context)
[index.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>알렉스 인사</title>
</head>
<body>
<h1>하하!</h1>
<p> 내가 누구냐고 물으신다면!</p>
<p> {{my}} {{name}} {{is_}}다!!!!!!!!</p>
</body>
</html>
지금까지 클라이언트가 요청한 URL 패턴과 일치하는 View함수를 연결해주는 urls.py
, urls.py
에 연결된 View함수가 정의된 views.py
, views.py
의 View함수와 연결된 Templates 디렉토리의 template(html)
을 다 같이 연결시켜봤다.
다음에는 실제로 데이터베이스에 저장되는 데이터가 있는 Models.py
에 대해서 알아보겠다.