Django 학습 노트 의 Class-Based-View
사실 Django 를 배 우 는 것 은 매우 간단 해서 거의 아무런 정력 도 쓰 지 않 고 입문 할 수 있다 는 것 을 모두 가 알 고 있다.url 을 설정 하여 함수 에 나 누 어 처리 하고 response 로 돌아 가 이해 하기 어 려 운 부분 이 거의 없습니다.
많이 써 서 야 어떤 문제 들 이 점차 깨 달 았 다.예 를 들 어 하나의 view 가 비교적 복잡 해서 많은 다른 함 수 를 호출 했다.이 함수 들 을 밀봉 하려 면 어떻게 합 니까?물론 주석 을 사용 할 수 있 습 니 다.
Python 은 대상 을 대상 으로 하 는 프로 그래 밍 언어 로 함수 로 만 개발 하면 대상 을 대상 으로 하 는 장점 이 많 습 니 다(계승,패키지,다 중).그래서 Django 는 나중에 Class-Based-View 에 가 입 했 습 니 다.클래스 로 View 를 쓸 수 있 습 니 다.이렇게 하 는 장점 은 주로 다음 과 같다.
GET 방법 을 처리 하 는 view 를 쓰 려 면 함수 로 쓰 면 다음 과 같 습 니 다.
from django.http import HttpResponse
def my_view(request):
if request.method == 'GET':
# <view logic>
return HttpResponse('result')
class-based view 로 쓰 면 아래 와 같 습 니 다.
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
# <view logic>
return HttpResponse('result')
Django 의 url 은 클 라 스 가 아 닌 호출 가능 한 함수 에 요청 을 할당 합 니 다.이 문제 에 대해 class-based view 는as_view()
정적 방법(즉,클래스 방법)을 제공 합 니 다.이 방법 을 사용 하면 하나의 인 스 턴 스 를 만 든 다음 에 인 스 턴 스 호출dispatch()
방법 을 통 해dispatch()
방법 은 request 의 method 에 따라 해당 하 는 방법 으로 request(예 를 들 어get()
, post()
등 을 처리 합 니 다.여기까지 이 방법 들 은 function-based view 와 차이 가 많 지 않 습 니 다.request 를 받 고 response 를 받 아야 합 니 다.방법 이 정의 되 지 않 으 면 Http Response NotAllowed 이상 을 던 집 니 다.url 에 이렇게 쓰 여 있 습 니 다.
# urls.py
from django.conf.urls import url
from myapp.views import MyView
urlpatterns = [
url(r'^about/$', MyView.as_view()),
]
클래스 의 속성 은 두 가지 방법 으로 설정 할 수 있 습 니 다.첫 번 째 는 흔히 볼 수 있 는 Python 방법 으로 하위 클래스 로 덮어 쓸 수 있 습 니 다.
from django.http import HttpResponse
from django.views import View
class GreetingView(View):
greeting = "Good Day"
def get(self, request):
return HttpResponse(self.greeting)
# You can override that in a subclass
class MorningGreetingView(GreetingView):
greeting = "Morning to ya"
두 번 째 방법 은 url 에서 클래스 의 속성 을 지정 할 수 있 습 니 다.url 에 클래스 속성 설정 Python
urlpatterns = [
url(r'^about/$', GreetingView.as_view(greeting="G'day")),
]
Mixin 사용 하기django 의 class-based-view(이하 cbv 로 약칭)를 이해 하려 면 먼저 django 가 cbv 를 도입 하 는 목적 이 무엇 인지 알 아야 한다 고 생각 합 니 다.django 1.3 이전에 generic view 는 이른바 통용 보기 로 function-based-view(fbv),즉 함수 기반 보 기 를 사 용 했 습 니 다.어떤 사람들 은 fbv 가 cbv 보다 더 pythonic 이 라 고 생각 하 는데,나 는 그렇지 않다 고 생각한다.python 의 중요 한 특성 중 하 나 는 대상 을 대상 으로 하 는 것 이다.cbv 는 python 의 대상 을 더욱 잘 나 타 낼 수 있다.cbv 는 class 방식 을 통 해 보기 방법 을 실현 합 니 다.class 는 function 에 비해 다 중 적 인 특정 을 이용 할 수 있 기 때문에 거시적인 차원 에서 프로젝트 안의 비교적 통용 되 는 기능 을 추상 화하 기 쉽다.다 중,설명 이 많 지 않 고 관심 있 는 친구 들 은 스스로 구 글 입 니 다.한 마디 로 한 물건 이 다양한 형태(특성)를 갖 고 있다 고 이해 할 수 있다.cbv 의 실현 원 리 는 django 의 소스 코드 를 보면 쉽게 알 수 있 습 니 다.대체적으로 url 경로 에서 이 cbv 에 도착 한 후에 cbv 내부 의 dispatch 방법 으로 배포 하고 get 요 구 를 cbv.get 방법 으로 처리 하 며 post 요 구 를 cbv.post 방법 으로 처리 합 니 다.다른 방법 은 유사 합 니 다.다 태 를 어떻게 이용 합 니까?cbv 에 mixin 이라는 개념 을 도입 했다.Mixin 은 기본 클래스 를 작성 한 다음 에 서로 다른 Mixin 조합 을 통 해 최종 적 으로 원 하 는 클래스 가 됩 니 다.
그래서 cbv 를 이해 하 는 기 초 는 Mixin 을 이해 하 는 것 입 니 다.Django 에 서 는 Mixin 을 사용 하여 코드 를 다시 사용 합 니 다.하나의 View Class 는 여러 개의 Mixin 을 계승 할 수 있 지만 하나의 View(View 의 하위 클래스 포함)만 계승 할 수 있 습 니 다.View 를 맨 오른쪽 에 쓰 고 여러 개의 Mixin 을 왼쪽 에 쓰 는 것 을 추천 합 니 다.Mixin 도 비교적 복잡 한 기술 입 니 다.본 고 는 상세 하 게 말 하지 않 고 나중에 Mixin 에 대한 글 을 쓰 세 요.
장식 기 를 사용 하 다
CBV 에서 method 사용 가능decorator 로 장식 하 는 방법.
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ProtectedView, self).dispatch(*args, **kwargs)
클래스 에 적 고 들 어 오 는 방법의 이름 도 쓸 수 있다.
@method_decorator(login_required, name='dispatch')
class ProtectedView(TemplateView):
template_name = 'secret.html'
여러 개의 장식 기 를 장식 하 는 방법 이 있다 면 list 로 쓸 수 있 습 니 다.예 를 들 어 아래 의 이 두 가지 문법 은 등가 이다.
decorators = [never_cache, login_required]
@method_decorator(decorators, name='dispatch')
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(never_cache, name='dispatch')
@method_decorator(login_required, name='dispatch')
class ProtectedView(TemplateView):
template_name = 'secret.html'
총결산이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.