AI 부트캠프/챕터4(12.05~12.27)

TIL 63

musukie 2024. 12. 16. 17:55

Django가 요청을 받고 응답을 하는 과정은 다음과 같다.

요청(Request)이 들어오면 -> URL(urls.py)에서 처리하고 -> View(views.py)에서 처리하고 -> Template(html)에서 처리하고 ->  응답(Response)을 전달한다.

 

우리는 도구의 사용법을 배우고 있는 것이기 때문에, 일단 사용법을 익힌 후에 작동 원리를 공부하는 것을 추천한다고 한다. 각각의 파트에서 어떤 티키타카가 일어나는 지를 이해하자.

 

먼저 urls.py부터 살펴보자. 이 파일에 아래와 같이 코드를 작성해줄 것이다.

urlpatterns = [
    path("admin/", admin.site.urls),
    path("index/", views.index),
]

이 부분은 어떤 URL 패턴으로 들어오면 어디로 보낼 지를 정해주는 곳이다. 예를 들어, "admin/"라는 패턴과 URL이 일치하면,  admin.site.urls로 보내겠다는 뜻이다. admin.site.urls 자리는 view다. 따라서 어떠한 것이 들어오면 어떤 view로 보낼 지를 지정하는 것이다.

 

여기서 /를 붙이는 이유를 살펴보자. 과거에는 /를 붙인 것과 붙이지 않은 것을 다른 것으로 인식했다. 그러나 현재는 /를 붙여서 주소창에 주소를 입력해도, /를 붙이지 않고 입력해도 같은 결과가 나온다. Django에서는 /를 붙이는 것을 권장한다. /를 붙이는 것을 '트레일링 슬래시'라고 한다.

 

view는 우리가 전에 만들었던 articles라는 앱을 살펴보면 찾을 수 있다. articles 폴더를 보면 views.py라는 파일이 있다. 여기에 view를 작성하면 된다. view를 작성하는 방법으로는 함수형 view, 클래스형 view가 있다. Django 기초 강의에서는 대부분을 함수형으로 view를 작성할 것이라고 한다. 클래스형은 심화 강의에서 다룰 예정이다. 함수형으로만 써도 되고, 클래스형으로만 써도 된다. 클래스 안에는 여러 개의 함수가 들어갈 수 있고, 어떤 클래스를 상속할 수도 있기 때문에, 코드를 줄일 수 있다고 생각하면 된다. 우리는 흐름을 눈으로 보기 위해서 함수형으로 작성할 것이다.

def index(request):
    pass

위의 코드가 함수형 view의 기본 형태다. 해석해보자. 함수 이름은 index고, 인자로는 request가 들어온다. request는 Django가 알아서 넣어주므로, 받아줄 변수를 선언해야 한다. 그리고 함수 안쪽에 이 함수로 요청이 들어왔을 때 할 작업들을 적어주면 된다. 함수를 만들었으니, 이제 url과 연결해주자.

 

우리는 지금 urls.py와 views.py가 같은 폴더 안에 있는 게 아니라, views.py는 articles 폴더 안에 있다. 우리는 articles 폴더 안의 views.py 파일, 즉 모듈을 가져와서 그 안에 있는 index 함수 view를 써야 한다.

from django.contrib import admin
from django.urls import path
from articles import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path("index/", views.index),
]

마지막에 트레일링 콤마까지 챙겨주었다.

 

이제 view를 제대로 작성해보자. h1 태그를 사용해서 "Hello, Django!"라는 것을 출력해볼 것이다. view를 다시 정리해보자면, 데이터 관련된 것은 Model과 이것저것 하고, Template이 필요하면 Template을 가져오고, Response를 만들어서 응답을 클라이언트에게 return해야 한다. 이 작업을 views.py에 작성할 것이다.

 

지금은 데이터와 관련된 것이 없다. 그래서 Response를 만들 것이다. HttpResponse는 Django 안쪽에 다 들어있기 때문에 from import로 불러와야 한다. 이러한 내용은 모르면 Django Docs에서 찾아봐야 한다. HttpResponse의 () 안에 첫 번째로는 내가 Response로 주고 싶은 html을 문자열로 적어주면 된다.

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def index(request):
    response = HttpResponse("<h1>Hello, Django!</h1>")
    return response

이제 터미널 창에서 python manage.py runserver로 서버를 실행해준다. 이 상태로 서버를 실행하면, 지금 들어온 URL 경로('http://127.0.0.1:8000/')는 아무런 패턴과도 일치하지 않아서 페이지를 찾을 수 없는 상태다. 404 에러가 뜬다. 경로를 /index 경로로 바꿔주면, 우리가 원했던 화면이 나오게 된다. 'http://127.0.0.1:8000/index/'

 

Chrome에서 주소(http://127.0.0.1:8000/index/)를 입력하는 걸로 HttpResponse를 날렸고, urls 파일을 거치고 views 파일을 거쳐서 HttpResponse가 만들어지고 그것을 return해서 Chrome에서 원하는 화면이 나온 것이다.

 

HttpResponse를 뜯어보면, 이것은 사실 함수가 아니라, 클래스에 생성자를 사용해서 내가 사용했음을 알 수 있다. 지금은 이 정도만 알면 된다. 굳이 더 뜯어볼 필요가 없다.

 

우리가 html을 작성하면, 기본 80줄은 넘어간다고 한다. 이를 views.py에 다 작성하는 것은 아니라는 생각이 들 것이다. 그러면 우리는 html 파일에 따로 작성하고, 그것을 보여주는 식으로 하고 싶어진다. 그 작업을 해보자. Django Template이 html 파일을 관장하는 곳이다. 우선은 views.py를 수정하자.

from django.shortcuts import render

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

render 함수의 결과를 반환할 것이다. 첫 번째로는 request 넣어온 요청을 그대로 넣고, 두 번째로는 Template을 넣는다. 어떤 Template으로 요청을 처리해서 return할 건지를 적어주는 것이다. 이제 index.html을 만들어주자.

 

우리가 만든 앱인 articles 폴더 안에 templates 폴더를 만들어준다. 그 폴더 안에 index.html 파일을 만들어준다. 여기에 ! 하고 탭을 누르면 기본적인 html이 자동완성된다. 그리고 우리는 body 태그 안에 Hello, Django!를 추가해주었다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello, Django!</h1>
    <div>This is my first Django PJT</div>
</body>
</html>

 

다시 과정을 설명하겠다. url을 들어온다. 우리는 http://127.0.0.1:8000/index/로 들어간다. 그러면 urls.py에서 admin/ 경로와 일치하지 않고, index/ 경로와 일치하니까 index view(views.index)로 가라고 한다. 이 때 render함수를 만난다. render함수는 template을 렌더링해서 html 파일을 return해주는 함수다. 여기서는 index.html을 가져와서 렌더링을 거쳐서 html 파일을 그대로 return하는 코드를 우리가 작성한 것이다. 서버를 실행하면 아래와 같이 나온다.

어떻게 Django가 index.html 파일을 찾아서 읽는 지에 대해 알아보자. my_first_pjt 폴더의 settings.py 파일에서 그 해답을 찾을 수 있다. 이 파일의 56번째 줄을 보면 TEMPLATES에 대한 설정이 있다. 여기에 'APP_DIRS': True로 돼있는 부분이 있다. True면, Django에게 template 파일들이 앱 안쪽 경로에 있으니 그것을 건드려야 한다는 것을 알려주는 것이다. 그래서 templates 폴더 이름을 오타내면 안 되는 것이다.

 

현재의 흐름을 다시 짚어보자. HttpRequest로 request가 들어오면, URLs를 찍고, View를 찍고, Template 가서 가지고온 다음, 다시 View로 와서 HttpResponse로 response를 return한다.

render(request, template_name, context)

위의 코드는 render 함수다. context로 넘겨진 데이터들을 template_name의 html 파일과 잘 버무려서 렌더링해서 나갈 것이다.

'AI 부트캠프 > 챕터4(12.05~12.27)' 카테고리의 다른 글

TIL 65  (2) 2024.12.18
TIL 64  (0) 2024.12.17
TIL 62  (1) 2024.12.16
WIL 10  (1) 2024.12.13
TIL 61  (1) 2024.12.13