우리 모두 알고 있듯이 django는 웹 애플리케이션 개발 디자인에 MVT(모델-뷰-템플릿)를 사용합니다.
뷰 자체는 요청을 받고 응답을 반환하는 호출 가능 항목입니다. Django는 클래스 기반 뷰라는 것을 제공하므로 개발자는 클래스 기반 접근 방식을 사용하거나 OOP 접근 방식을 사용하여 뷰를 작성할 수 있으므로 이는 단순한 기능 이상의 것입니다. 이 클래스 기반 뷰는 뷰를 구조화하고 상속 및 믹스인을 통해 재사용할 수 있도록 설계되었습니다.
django 문서에 잘 설명되어 있듯이 함수 기반 보기의 문제점 중 하나는 일부 구성 옵션 이상으로 확장하거나 사용자 정의할 수 있는 방법이 없어 많은 실제 애플리케이션에서의 유용성이 제한된다는 것입니다.
django의 기본 클래스와 믹스인 툴킷은 유연성을 극대화하도록 설계되었습니다. View 클래스 상속을 사용하여 django에서 가장 기본적인 클래스 기반 뷰를 사용하는 방법을 살펴보고 이를 함수 기반 뷰와 비교해 보겠습니다.
#views.py using View class inheritance from django.views import View from django.http import HttpResponse, HttpRequest class IndexView(View): def get(self, request: HttpRequest): # imagine 10 line of view logic here return HttpResponse("Hello world from indexview") def post(self, request: HttpRequest): # imagine 10 line of view logic here return HttpResponse("Hello world from indexview in post method")
#views.py function based view from django.http import HttpResponse, HttpRequest def index(request: HttpRequest): if request.method == "GET": # imagine 10 line of view logic here return HttpResponse("Hello world from index funcion view") elif request.method == "POST": # imagine 10 line of view logic here return HttpResponse("Hello world from index funcion view in post method")
위를 보면 클래스 기반 뷰를 사용하면 단일 뷰 함수 내에서 조건부 분기 코드를 사용하는 대신 다양한 클래스 인스턴스 메서드를 사용하여 다양한 HTTP 요청 메서드에 응답할 수 있습니다. 이제 위의 각 뷰에서 각 메서드에 10줄의 논리를 추가했다고 상상해 보세요. 어느 것이 더 살펴보기 쉬운지 알 수 있을 것입니다.
클래스 기반 뷰를 URL 구성에 등록하려면 기본적으로 클래스 뷰를 호출 가능한 함수로 변환하는 as_view() 클래스 메서드를 호출해야 합니다. 이 변환된 함수는 setup()을 호출하여 해당 속성을 초기화한 다음 사용자가 어떤 메서드(GET, POST 또는 기타 메서드)를 가지고 있는지 확인하기 위해 dispatch()를 호출하고 요청 메서드를 클래스 기반 뷰가 원래 가지고 있는 해당 일치 메서드에 연결합니다.
#urls.py from django.urls import path from myapp.views import IndexView, index urlpatterns = [ path("", IndexView.as_view(), name=IndexView.__name__), path("index/", index, name=index.__name__), ]
클래스 기반 뷰는 템플릿을 렌더링하는 render() 함수와 같은 django의 모든 http shortcut도 지원합니다. 여기에는 렌더링 바로 가기를 사용하고 django 메시지 프레임워크와 협력하는 django cbv의 수정된 예가 있습니다.
class IndexView(View): def get(self, request: HttpRequest): # imagine 10 line of view logic here return render(request, "GEtindex.html") def post(self, request: HttpRequest): # imagine 10 line of view logic here messages.add_message(request, messages.INFO, "POST Success") #add display success message here by django messages framework return render(request, "POSTindex.html")
전체적으로 django 클래스 기반 뷰를 사용하면 개발자가 뷰 로직을 더 잘 이해하도록 작성할 수 있습니다. 뷰 로직이 더 복잡할수록 함수 기반 뷰만 사용하면 읽기가 더 어려울 것이라고 확신합니다(무엇을 확인하기에는 if 문이 너무 많습니다). 메서드는 예를 들어 사용자가 사용하는 것이며 확장하기 어려운 반면 django cbv는 뷰 논리를 get 및 post 메서드와 같은 여러 메서드로 분리하도록 설계되었습니다. 원한다면 상속에서 다시 사용할 수 있습니다. 그러나 클래스에 상속이 많을수록 추상화로 인해 읽기가 더 어려워질 것이라고 주장할 수 있습니다.
장고 문서의 클래스 기반 보기에 대한 자세한 내용은 여기, 여기, 여기에서 확인할 수 있습니다.
또한 django 클래스 기반 보기에 초점을 맞춘 좋은 대체 문서는 ccbv.co.uk입니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3