본문 바로가기
Python/Django Ⅲ

(Review) Django 기본 / 동적 뷰

by Mr.DonyStark 2024. 5. 24.

□ 기본 뷰

  ● my_site 라는 프로젝트 생성 후 first_app이라는 하위 앱생성

  ● url 로 https://***.**.**.*/first_app/ 과 https://***.**.**.*/first_app/딕셔너리키에 따른 페이지를 만들어보고자함

    ○ app > views.py

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

#FBV
def simple_view(request): #request 시 SIMPLE VIEW 응답으로 표시
    return HttpResponse("SIMPLE VIEW")

#딕셔너리 생성
articles = {
    "sports" : "sports page",
    "finance" : "Finance Page",
    "politics" : "Politics Page"
}

def sports_view(request): #request시 sports에 대한 벨류 값이 응답으로 표시되도록 지정
    return HttpResponse(articles["sports"])
    
def finance_view(request): #request시 finance에 대한 벨류 값이 응답으로 표시되도록 지정
    return HttpResponse(articles["finance"])

 

    ○ app > urls.py

from django.urls import path
from . import views

urlpatterns = [
    path("",views.simple_view, name="simpleview"), #""프로젝트레벨에서 정의. 만약 "sample/로 기재하면" /first_app/sample/이됨
    path("sports/",views.sports_view, name="sportsview"),
    path("finance/",views.finance_view, name="finance")
]

 

    ○ project > urls.py

from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
    path("", views.home_view), #project level urls
    path('admin/', admin.site.urls),
    #paht(라우트, include("app명.urls"))
    path("my_app/", include("my_app.urls")),
    path("first_app/", include("first_app.urls")), #app first_app에 대한 url 지정
]

 

□ 동적뷰

  ● my_site 라는 프로젝트 생성 후 first_app이라는 하위 앱생성

  ● url 로 https://***.**.**.*/first_app/ 과 https://***.**.**.*/first_app/딕셔너리키에 따른 페이지 응답과 키값이 아닌 숫자를 입력했을때 자동으로 페이지를 찾아서 응답해주는 뷰를 생성하고자함

    ○ app > views.py

      - num_page_view 를 보면 사용자가 숫자를 입력 했을 때 입력한 값에 따라 코드내에서 지정한 딕셔너리를 검색 후 자동으로 페이지가 리다이렉트 되도록 HttpResponseRedirect 함수를 사용했음

      - num_page_view에서의 reverse 함수는 URL 패턴의 이름과 인수를 사용하여 해당 URL을 동적으로 생성되도록 코드를 작성함. 주로 URL 하드코딩을 피하고, 코드의 가독성과 유지 보수성을 높이기 위해 사용.

     - num_page_view에서의 reveser 함수 인자로 topic-page가 있는 데 이는 urls.py에서 news_views에 대한 url을 의미함

from django.shortcuts import render
from django.http.response import HttpResponse, HttpResponseNotFound, Http404, HttpResponseRedirect
from django.urls import reverse
# Create your views here.

#FBV
def simple_view(request):
    return HttpResponse("SIMPLE VIEW")

#동적뷰
articles = {
    "sports" : "sports page",
    "finance" : "Finance Page",
    "politics" : "Politics Page"
}

def news_view(request, topic):
    try:
        good_result = articles[topic]
        return HttpResponse(good_result)
    except:
        bad_result = "Not find Page"
        return HttpResponseNotFound(f"<h1>{bad_result}</h1>")
        # raise Http404("404 Generic Error") # .html과 함께 사용시. HTTP404 를 하려면 settings DEBUG TRUE, ALLOW HOST 설정

#domain.com/first_app/1 입력하면 domain.com/first_app/finance 로 redirection 
def num_page_view(request, num_page):
    try:
        topic_list = list(articles.keys()) #["sports","finance","politics"]
        topic = topic_list[num_page]
        webpage = reverse("topic-page", args=[topic])
        return HttpResponseRedirect(webpage)
    except:
        bad_result = "입력하신 인덱스에 대한 카테고리가 준비중입니다."
        return HttpResponseNotFound(f"{bad_result}"))

 

    ○ app > urls.py

from django.urls import path
from . import views

urlpatterns = [
    path("",views.simple_view), #domain.com/first_app   + view에서 simplie_view 사용
    path("<str:topic>/",views.news_view, name="topic-page"), #url에 대한 name 지정
    path("<int:num_page>", views.num_page_view)
]

 

 ○ project > urls.py

from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
    path("", views.home_view), #project level urls
    path('admin/', admin.site.urls),
    #paht(라우트, include("app명.urls"))
    path("my_app/", include("my_app.urls")),
    path("first_app/", include("first_app.urls")), #app first_app에 대한 url 지정
]