이번 섹션에서는 django에서 url이 어떻게 동작하는지 알아보고 template를 적용해봅시다!
아래의 코드는 urlpatterns의 기본 구조입니다.
urlpatterns = [path("admin/", admin.site.urls),]
path부분은 url이고, 뒤에는 view입니다. url은 /rooms, /login ...에 해당하는 내용으로 요청에 바로 응답하는 방법이고, view는 사용자가 이 요청에 반응하는 방법입니다.
모든 url들이 URL_conf에서 mapping을 할 때 config/urls.py에서 전부 확인한다면 이는 객체지향의 특성에 어긋납니다. /room/~과 관련된 것은 room이라는 app에서 처리를 하고 /user/과 관련된 처리는 user이라는 app에서 처리를 하도록 합니다.
그리고 config/urls.py에는 해당 url이 들어왔을 때 어느 위치에서 처리해야할지만 등록합니다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("", include("core.urls", namespace="core")),
path("rooms/", include("rooms.urls", namespace="rooms")),
path("admin/", admin.site.urls),
]
나중에 해당 url을 처리할때 url전부를 하드코딩하는 것 이 아니라, name=""
으로 지정해 간편하게 해당 url을 지칭할 수 있습니다.
from django.urls import path
from rooms import views as room_views
app_name = "core"
urlpatterns = [path("", room_views.all_rooms, name="home")]
예를 들어 room 이라는 app에도 core 라는 view가 있고, user 라는 app에도 core 라는 view가 있으면 이를 구분해야 하는데요! 이 때 namespace를 사용하여 구별해주면 됩니다. room:core
와 user:core
로 구별합니다. 이를 사용하기 위해선 app="core"
처럼 label을 지정해서 사용해야 합니다.
view
는 해당 url로 매번 들어갈 때마다 HttpResponse를 생성합니다. 그리고 HttpResponse를 응답해줘야만 합니다. 이 방식이 브라우저를 구성하는 기본 방식입니다.
from django.http import HttpResponse
def all_rooms(request):
return HttpResponse(content="<h1>Hello</h1>")
request를 받으면 단순히 HttpResponse로 응답합니다. 그러나 template(html로 구성)를 rendering(html을 렌더링_보냄)하면 수동적으로 매번 작성하지 않아도 됩니다.
render는 HttpResponse 안에 html을 넣어서 보내줄 수 있습니다. 즉 template를 렌더링할 수 있습니다.
from django.shortcuts import render
def all_rooms(request):
return render(request, "all_rooms.html", context={"rooms":all_rooms})
request 없이 response를 할 수 없으며 "all_rooms.html"이라는 파일을 template_name 자리에 넣어줍니다.
template 파일은 templates를 위한 폴더를 만들어 관리합니다.(templates/all_rooms.html
)
그리고 settings.py에 templates라는 파일을 인식할 수 있도록 디렉토리를 정해줍니다.
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [os.path.join(BASE_DIR, "templates")],
.
.
}]
template을 꾸미는 방법을 알아봅시다. 경로는 templates/all_rooms.html입니다.
{% for room in rooms %} #view / context={"rooms":all_rooms})
<h1>{{room.name}}</h1>
{% endfor %}
{{room.name}}
로 room이 object인 것처럼 대합니다. 왜냐하면 해당의 room은 object이기 때문입니다.
template이름은 반드시 template폴더안에 있는 이름과 같아야 하고, view이름은 urls.py(divide and conquer했으므로 이 경우 core/urls.py)이름과 같아야만 합니다.
urlpatterns = [path("", room_views.all_rooms, name="home")]