본문으로 바로가기

Django 웹사이트 개발 - 2. 기본 웹페이지 렌더링 절차

기본적으로 HTML로 <html>, <body> 태그 등을 이용하여 웹페이지를 만들고 해당 html 파일과 PHP 등을 통해 간단한 액션 정도가 이루어지는 웹페이지 정도만 만들어본 경험이 있는터라, 프레임워크를 통해 함수, 메소드등을 만들고 각 모델, 뷰 등을 만드는 과정이 너무 이해가 가지 않았다. 예전에 루비온레일즈 강의를 통해 웹사이트를 한번 만들어 본적은 있지만, 강의를 그대로 따라 만들고 bootstrap 테마만 입혀서 만들어 본 것이 다였다.

책 또는 강의들 전부 Model - View - Templates 모델이 있으며, MVC 모델과 어떤 용어가 다르고, 처음부터 model을 만들고 모델을 만들었으니 뷰를 만들고, 하는 방식이 너무 이해가 가지 않아서( 전부 같은 순서로 강의한다...) 내 방식대로 만들면서 포스팅을 하려고 한다. 

이번에는 기본 프로젝트 세팅 이후, 앱을 만들고, 웹페이지가 어떻게 Django 프레임워크를 통하여 웹 브라우저에 출력되는 지에 대하여 설명을 적어보겠다.


맨 처음 127.0.0.1:8000에 접속했을 때 간단한 index.html을 보이게 하는 방법이다.

manage.py 경로에서 python manage.py startapp '앱 이름' 명령어를 통해 앱을 만들어준다. 이 때 앱이란 프로젝트 단위의 하위 단위로, 각 기능 등을 분류해주는 개념으로 쓰이는 것 같다. 강의에는 보통 board, user 등의 앱을 만들어서 게시판을 만들거나, 유저 로그인 기능을 만드는 것으로 쓰인다. 

내가 만드려는 것은 웹사이트이므로, board, user 등의 앱 말고 home이라는 이름으로 앱을 만들어 보았다. 앱을 만들고 나서는 항상 settings.py의 INSTALLED_APPS에 등록해주어야 한다.

< settings.py에 'home' 등록, ,(comma)를 빼먹지 않도록 주의 >

 

현재 home의 templates 폴더에 index.html 파일을 넣어둔 상태다. templates 폴더는 초기에 없으며 별도로 생성해주어야 하고, html과 같은 정적인 파일을 넣어두는데 사용한다. index.html을 보여주고 싶은데, django에서 무언가를 보여주는건 view로 만든다. 

< http://pythonstudy.xyz/python/article/307-Django-%ED%85%9C%ED%94%8C%EB%A6%BF-Template >

템플릿에 대한 설명은 위와 같다. 설명이 잘 나와있으므로 해당 링크를 들어가서 보는 것을 추천한다. 책이나 인강등에서는 현재 내가 만들어둔 이미지 처럼 App의 하위에 templates 폴더를 만들고 바로 html 파일을 집어 넣는 경우가 있어서 /home/templates/index.html로 되어있으나, 상단 이미지에서 언급한대로 /home/templates/home/index.html로 고치는 것이 좋을 것 같다.  

일단 지금은 127.0.0.1:8000 (장고 내장 서버)로 접속했을 때 index.html을 띄워주려고 한다. 해당 url로 접근했을 때 해당 html이 뜨게 하려면, 해당 url 접속시 (request) 해당 html(index.html)을 render(나타내주는) 메소드를 사용하여 함수를 만들면 된다. render 함수 사용도 상단 이미지 링크에 자세한 설명이 나타나있다. 

기본적으로 첫번째 매개변수로 request를 받고, 두번째 매개변수로 나타내주고자 하는 템플릿, 세번째 매개변수로 해당 템플릿에 데이터를 '키:밸류값'(딕셔너리)으로 전달해줄 수 있다. 따라서, 해당 render함수에 'index.html'을 넣고, return이 되는 함수를 만든 뒤, 해당 함수를 home 앱의 urls.py에서 불러오는 식으로 설계를 하게된다. 

< home의 views.py >

def index(request): 는 index라는 함수를 만들고, 매개변수로 request를 받는다는 뜻이다. return render로 요청을 받은 경우 render함수에서 지정된 템플릿, 데이터를 반환해주게 되는데, 상단 이미지에는 전달할 데이터가 없으므로 {}로 나타나있다. 이제 저 home 앱views.py 파일index 함수를 url과 연결시켜보자.
(-> 해당 함수를 다른 파일에서 import 하려면 from home.views import index와 같은 형태가 되며, views만 가져오는 경우 from home import views가 된다. home 앱 내에서라면 from . import views로 표현할 수 있겠다.)

메인 urls.py에 연결된 home의 urls.py 파일을 먼저 확인해본다.

장고 프로젝트의 url은 기본적으로 메인 프로젝트 하위의 urls.py에서 관리된다. 처음 생성되면 admin/ 에 대한 url만 지정되어 있는데, 여기에 각 앱에 대한 url을 추가하여 사용할 수 있다.

<urls.py에 home.urls를 추가한 상태>

주소창에 어떠한 주소를 입력 했을 때, 해당 주소에 대한 페이지를 설정하는 것으로 생각하면 된다. 상단 이미지의 path('admin/', admin.site.urls) 형식으로 특정 뷰, 함수를 연결할 수 있고, 아래 path('', include('home.urls')) 처럼 다른 urls.py 파일을 include 하여 사용할 수 있다. 이 때 home은 해당 app의 이름이며, 이 경우는 상단 이미지처럼 django.urls의 include를 import하여 사용해야 한다.

< home의 urls.py 파일 >

url의 경우 상단 이미지의 path('', views.index, name='index')와 같은 형식으로 사용되는데, ''의 경우 아무것도 없는 127.0.0.1:8000을 나타낸다. 위쪽 메인 프로젝트의 urls.py를 보면 'admin/'에 대한 path가 설정되어 있는것을 볼 수 있는데, 이것은 '127.0.0.1:8000/admin/'에 대한 접속을 의미한다. 

위와 같이 설정하고 runserver를 하는 경우 127.0.0.1:8000으로 접속시 home의 index.html이 나타나게 된다.

결과적으로 어떠한 페이지를 나타내고 싶은 경우, 해당 html 파일과 view 와의 연동이 필요하며, 이 view는 urls.py에서 url 주소와 매핑이 되어야 한다는 것을 알 수 있다. 단순히 특정 주소(url)에 대한 정적 웹페이지만 나타내주는 경우 이 방법으로만 해도 가능하지만, 프레임워크를 사용하여 동적인 부분도 연계해서 사용할 수 있다.

다음 포스팅에서는 html 파일을 확장하여 사용하는 확장 템플릿에 대하여 공부하고 올리도록 할 예정이다. 책, 강의에서 {% %} 형태로 사용하는 태그인데, Django 템플릿 언어라고 한다. https://django-doc-test-kor.readthedocs.io/en/old_master/topics/templates.html 의 내용이 될 것 같다.