Django: (05) 클래스 뷰, 장식기 및 중간부품

4513 단어
Django: (05) 클래스 뷰, 장식기 및 중간부품
1. 클래스 보기의 정의와 사용
Django에서는 클래스를 통해 클래스 뷰라는 뷰를 정의할 수도 있습니다.
클래스 보기 정의: 클래스를 정의합니다. Django가 제공하는 View 클래스를 계승해야 합니다.
from django.views.generic import View

 class TestView(View):

     def get(self, request):
         """get  """
         return render(request, 'index.html')

     def post(self, request):
         """post  """
         #    
         return HttpResponse('    ')

루트 설정: 클래스 보기를 호출하는 as_view() 방법
 urlpatterns = [
     ...
     url(r'^Test$', views.PostView.as_view()),
 ]

as_view()의 역할은 서로 다른 요청 방식에 따라 다른 요청 방법을 호출하는 것입니다. 자세한 내용은 asview () 방법 원본 및 내부에서 호출된 디스패치 ()
2. 클래스 보기 계승 확장 클래스
정의된 확장된 부모 클래스 이름은 보통 Mixin으로 끝납니다. 클래스 보기는 다중 계승을 통해 그들의 방법을 계승할 수 있습니다.
  • ListModelMixin 조회 다중 데이터(리스트 데이터)
  • CreateModelMixin 새로운 데이터
  • RetrieveModelMixin 데이터 조회
  • UpdateModelMixin데이터 수정
  • DestroyModelMixin 데이터 삭제
  • 이러한 Mixin 클래스는 각각 다른 클래스 뷰 방법을 제공합니다\TODO: 추가 상세 정보\
    class DepartmentView(CreateModelMixin, ListModelMixin, View):
        """
                 
        """
        def get(self, request):
            #     ListModelMixin list  
            return self.list(request)    
    
        def post(self, request):
            #     CreateModelMixin create  
            return self.create(request) 
    
    class EmployeeView(CreateModelMixin, View):
        """
          CreateModelMixin   
        """
        def post(self, request):
            #     ListModelMixin list  
            return self.create(request)

    3. 보기에 장식기 추가
    장식기: 기존 함수를 바꾸는 전제에서 함수 호출 전이나 이후에 추가 조작을 실행합니다
    1、장식기 하나 준비
    def check_ip(view_fun):
         """   :     ip  """
         def wrapper(request, *args, **kwargs):
             #               :
             #   ip     
             IP = request.META.get('REMOTE_ADDR')
             if IP in ['192.168.210.160']:
                 return HttpResponse('IP    ')
             return view_fun(request, *args, **kwargs)
         return wrapper

    2、우리 위의 장식기를 직접 사용할 수 없습니다(self 파라미터 부족)
    method 필요decorator 장식기, 함수 장식기는 첫 번째self 파라미터를 보충하여 클래스에 적용할 수 있도록 합니다.
    @method_decorator(check_ip)

    3. 클래스 보기의 특정한 방법에 장식기를 추가
    class PostView(View):
    
        @method_decorator(check_ip)
        def post(self, request):
            return HttpResponse('      ')

    4. 클래스 보기의 모든 방법에 장식기를 적용한다.
    디스패치 방법@method_decorator(check_ip)을 추가하면 클래스 보기에 모든 방법에 장식기를 적용할 수 있습니다.
    class PostView(View):
    
        @method_decorator(check_ip)
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request, *args, **kwargs)

    5. 다른 방법:
    클래스에 장식기를 추가하고 어떤 방법으로 장식할지 지정합니다: @method_decorator( , name=' ')
    @method_decorator(check_ip, name='get')
    class PostView(View):
    
        def get(self, request):
            return render(request, 'index.html')
    
        def post(self, request):
            return HttpResponse('    ')

    4. Django 중간부품
    보기 함수 호출 전이나 이후에 추가 작업을 수행하고 Django의 입력이나 출력을 전역적으로 수정하는 경량급 플러그인 시스템
    방법
    역할
    반환값__init__(self, get_response=None)
    서버 시작(재부팅) 시 한 번 실행
    없음process_request(self, request)
    보기가 실행되기 전에 호출
    되돌아오기None: 보기를 실행합니다.반환HttpResponse: 뷰를 다시 실행하지 않습니다.process_response(self, request, response)
    보기가 실행된 후에 호출
    HttpResponse 객체로 돌아가야 합니다.
    1. 중간부품 정의
    Django의 MiddlewareMixin 확장 클래스를 상속하여 실현
    class MyMiddleware(MiddlewareMixin):
        def process_request(self, request):
            print('before   ')
    
        def process_response(self, request, response):
            print('after   ')
            return response     #        

    process_request (): None이나response 대상을 되돌려줍니다.response 대상을 되돌려주면 보기 함수는 다시 실행되지 않습니다
    2. settings 파일에서 설정
    MIDDLEWARE = [
         'middlewares.MyMiddleware',  #      
     ]

    3. 다중 중간부품의 실행 순서
  • 보기 전에 실행된 프로세스에 대해request 방법, 먼저 등록된 중간부품을 먼저 실행
  • 보기 다음에 실행되는 프로세스response 방법, 등록된 중간부품이 먼저 실행
  • 여러 개의 중간부품 간의 의존 관계를 주의해야 하며, 의존된 중간부품은 앞에서 성명해야 한다
    posted @
    2018-11-18 17:40 밤을 들고 읽기(
    ...) 설명(
    ...) 모음 편집

    좋은 웹페이지 즐겨찾기