django 클래스 보기

3054 단어 django
  • 클래스 보기 실현
  • 함수로 정의된 보기를 함수시도라고 한다
  • Django에서 클래스를 통해 하나의 보기를 정의할 수 있는데 이를 클래스 보기
  • 라고 부른다.
  • 클래스 보기의 사용
  • 하나의 클래스를 정의하고 Django가 제공한 View 클래스
     from django.views.generic import View
    
     class PostView(View):
    
         def get(self, request):
             """get  :       """
             return render(request, 'post2.html')
    
         def post(self, request):
             """post  :       """
             #     
             return HttpResponse('      ')
    
  • 를 계승한다.
  • 클래스 보기를 호출하는 as_view() 방법 설정 url
     urlpatterns = [
         ...
         #      
         url(r'^post2$', views.PostView.as_view()),
     ]
    

  • 클래스 보기의 장점: 함수 보기 코드의 가독성과 복용성이 더 좋다
  • 뷰에서 장식기 사용
    1. 함수 보기에서 장식기 사용하기
    수요: IP 블랙리스트 방문 금지 게시판 인터페이스 실현.해결: 보기 함수에서 장식기를 사용하여 다음과 같이 실현할 수 있다.
  • 함수 보기에 대한 장식기 정의
     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
    
  • 보기 함수에 장식
     @check_ip
     def post(request):
         """GET  :       """
         return render(request, 'post.html')
    
    또는: URL에 방법 호출을 통해 장식기를 추가할 수도 있음
     urlpatterns = [
         ...
         #     
         url(r'^post$', check_ip(views.post))
     ]
    
  • 주의: 이런 장식기를 추가하는 방식은 코드가 읽을 수 없기 때문에 사용을 권장하지 않습니다

  •  
    2. 클래스 보기 사용 장식기
    (1) 루트에 장식기 추가
    예를 들어 다음과 같이 장식기를 루트에 추가하면 클래스 보기에서 모든 방법이 장식기를 사용하지만 읽을 수 없어서 사용을 권장하지 않습니다.
    urlpatterns = [
        ...
        #     
        url(r'^post2$', check_ip(views.PostView.as_view()))
    ]
    

    (2) 클래스 보기 방법에 추가
  • 주의: 함수에 정의된 장식기는 클래스 보기에 직접 적용할 수 없습니다. 왜냐하면self 파라미터가 하나 없기 때문입니다
  • 해결:method 사용 가능decorator 장식기, 함수 장식기에 첫 번째self 파라미터를 추가하여 클래스에 적용할 수 있도록 합니다.

  • (1) 클래스 보기의 특정한 방법에 장식기를 추가합니다.
    class PostView(View):
    
        def get(self, request):
            return render(request, 'post2.html')
    
        @method_decorator(check_ip)
        def post(self, request):
            return HttpResponse('      ')
    

    (2) 클래스 뷰의 모든 방법에 장식기를 적용합니다.
    class PostView(View):
    
        @method_decorator(check_ip)
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return render(request, 'post2.html')
    

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

    좋은 웹페이지 즐겨찾기