Django(장고) urls.py & views.py & templates

장현웅·2023년 9월 3일
0

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.pyTemplates부분에 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.pypingpong(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에 대해서 알아보겠다.

0개의 댓글