Django의 클래스 뷰 및 중간부품

4293 단어 framework
Django의 클래스 뷰 및 중간부품
클래스 보기
클래스 1의 도입
함수로 정의된 뷰는 함수 뷰(FBV)가 됩니다.
이해하기 편함그러나 하나의 보기에 대응하는 경로가 다양한 HTTP 요청 방식을 지원할 때 하나의 함수에서 서로 다른 업무 논리를 작성해야 하기 때문에 코드의 가독성과 복용성이 좋지 않다Django에서도 클래스를 사용하여 클래스 뷰(CBV)라는 뷰를 정의할 수 있습니다.
클래스 보기를 사용하면 보기에 대응하는 서로 다른 요청 방식을 클래스의 다른 방법으로 구별하여 정의할 수 있다
코드 가독성 향상클래스 보기는 함수 보기에 비해 더욱 높은 복용성을 가진다. 예를 들어 다른 곳에서는 특정한 클래스 보기의 특정한 논리를 사용하고 이 클래스 보기를 직접 계승하면 된다2가지 보기 사용
클래스 뷰를 정의하려면 Django에서 제공하는 상위 클래스 View를 상속해야 합니다.
루트를 설정할 때, 클래스 보기의 as_view() 방법을 사용하여 하나의 보기 함수로 전환합니다
urlpatterns = [
    url(r'^register/$', views.Register.as_view(), name='register'),
]

3가지 보기 사용 장식기
클래스 보기에 장식기를 추가하려면 세 가지 방법을 사용할 수 있습니다
함수 보기를 위한 장식기를 준비할게요.
def my_decorator(func):
    def wrapper(request, *args, **kwargs):
        print('in decorator')
        print(request.path)
        return func(request, *args, **kwargs)
    return wrapper

class DemoView(View):
    def get(self, request):
        print('is get')
        return HttpResponse('ok')

    def post(self, request):
        print('is post')
        return HttpResponse('ok')

3.1 클래스 뷰에서 장식
urlpatterns = [
    url(r'^demo/$', my_decorate(DemoView.as_view()))
]

이런 방식은 클래스 보기의 모든 요청 방법에 장식기 행위(보기 입구, 요청을 나누어 주기 전)를 추가하지만 이런 장식 행위는 URL 설정에 넣는다. 이렇게 보기만 보면 이해하기 어렵고 코드의 완전성에 불리하며 사용을 권장하지 않는다.
3.2 클래스 뷰에서 장식
클래스 보기에서 함수 보기를 위한 장식기를 사용할 때 직접 장식기를 추가할 수 없음methoddecorator는 이를 클래스 보기 방법에 적용되는 장식기로 변환합니다.
from django.utils.decorators import method_decorator    
#             
class DemoView(View):

    @method_decorator(my_decorator)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def get(self, request):
        print('is get')
        return HttpResponse('ok')

    def post(self, request):
        print('is post')
    return HttpResponse('ok')

method_decorator 장식기는name 파라미터를 사용하여 장식하는 방법을 가리킬 수 있습니다
#             
@method_decorator(my_decorator, name='dispatch')
class DemoView(View):

    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def get(self, request):
        print('is get')
        return HttpResponse('ok')

    def post(self, request):
        print('is post')
        return HttpResponse('ok')

3.3 패브릭 Mixin 확장 클래스
객체에 대한 다중 상속 특성 사용
class MyDecoratorMixin(object):
       def get(self, request):
        print('is get')
        return HttpResponse('ok')

class DemoView(MyDecoratorMixin, View):

    def post(self, request):
        print('is post')
        return HttpResponse('ok')

중간부품
django의 중간부품은 경량급, 밑바닥 플러그인 시스템으로 Django의 요청과 응답 처리 과정에 개입하여 Django의 입력이나 출력을 수정할 수 있다.중간부품의 디자인은 개발자에게 침입이 없는 개발 방식을 제공하여 Django 프레임워크의 건장성을 강화했다.
우리는 중간부품을 사용하여 Django가 보기를 처리하는 다양한 단계에서 입력이나 출력에 관여할 수 있다.
1 중간부품의 정의 방법
중간부품 공장 함수를 정의한 다음 호출할 수 있는 중간부품을 되돌려줍니다
중간 가격 공장 함수는 호출 가능한 get 을 받아들여야 합니다response 객체
되돌아오는 중간부품도 호출할 수 있는 대상이며, 보기와 같이 리퀘스트 대상 파라미터를 받아들여서response 대상을 되돌려야 한다
def simple_middleware(get_response):
    #          Django                

    def middleware(request):
        #                      
        response = get_response(request)
        #                         
        return response
    return middleware

우리가 정의한 중간부품이 완성되면 프로젝트의 동명 폴더에 settings가 필요합니다.py 파일에 등록 중간부품 추가
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'users.middleware.my_middleware',  #         
]

2 다중 중간부품의 실행 순서
요청 보기가 처리되기 전에 중간부품은 위에서 아래로 순서대로 실행됩니다 요청 보기가 처리된 후 중간부품의 오른쪽 아래에서 위로 순서대로 실행

좋은 웹페이지 즐겨찾기