Django 학습 노트 의 Class-Based-View

5183 단어 djangoclassbasedview
머리말
사실 Django 를 배 우 는 것 은 매우 간단 해서 거의 아무런 정력 도 쓰 지 않 고 입문 할 수 있다 는 것 을 모두 가 알 고 있다.url 을 설정 하여 함수 에 나 누 어 처리 하고 response 로 돌아 가 이해 하기 어 려 운 부분 이 거의 없습니다.
많이 써 서 야 어떤 문제 들 이 점차 깨 달 았 다.예 를 들 어 하나의 view 가 비교적 복잡 해서 많은 다른 함 수 를 호출 했다.이 함수 들 을 밀봉 하려 면 어떻게 합 니까?물론 주석 을 사용 할 수 있 습 니 다.
Python 은 대상 을 대상 으로 하 는 프로 그래 밍 언어 로 함수 로 만 개발 하면 대상 을 대상 으로 하 는 장점 이 많 습 니 다(계승,패키지,다 중).그래서 Django 는 나중에 Class-Based-View 에 가 입 했 습 니 다.클래스 로 View 를 쓸 수 있 습 니 다.이렇게 하 는 장점 은 주로 다음 과 같다.
  • 코드 의 재 활용 성 을 향상 시 켰 고 대상 을 대상 으로 하 는 기술 을 사용 할 수 있다.예 를 들 어 Mixin(다 중 계승)
  • 서로 다른 함수 로 서로 다른 HTTP 방법 으로 처리 할 수 있 으 며,많은 if 판단 을 통 해 코드 가 독성 을 높 일 수 있 습 니 다.
  • class-based views 사용 하기
    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'
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

    좋은 웹페이지 즐겨찾기