Django 미들웨어 회피 방법

Django 미들웨어 중간에 건너뛰고 싶다 혹은 일부 함수는 다르게 적용되고 싶다면 어떻게 적용하는지 알아보자.

 

여기서 정리한 모든 내용은 현재 듣고 있는 장고 강의에 소스에 포함된 내용을 공부할 겸 추려본다 - Django 실전 프로젝트 1 - URL Shortener 서비스 ( 패스트캠퍼스 )

 

방식은 데코레이터 함수를 적용해서 구현하는 것이다.

아래와 같이 특정 유저만 들어오도록 하는 데코레이터 함수를 구현해 본다.

 

def admin_only(function):
    @wraps(function)
    def wrap(request, *args, **kwargs):
        is_admin = request.user.is_superuser
        if is_admin:
            return function(request, *args, **kwargs)
        else:
            raise Http404

    return wrap

 

이제 이 데코레이터 함수를 admin만 접근을 원하는 함수에 wrapping 한다.

아래와 같이 사용하면 된다.

 

@login_required
@admin_only
def url_list(request):
    # command_handler()
    urls = (
        ShortenedUrls.objects.order_by("-id")
        ...

 

당연히 login 은 되어야 하고, user가 admin이 아니면 위에 정의한 대로 HTTP 404 에러를 출력해 준다.

 

근데 DRF (Django REST Framework) 에서는 이러한 것이 필요없다. 기본으로 정의된 문법이 있다.

permissions 라는 클래스가 이미 정의되어 있어 이 부분을 활용하면 된다.

 

permissions.IsAuthenticated
permissions.IsAdminUser

 

뷰 정의 시에 아래와 같이 permission_classes 를 정의해 두면 된다.


class UrlListView(viewsets.ModelViewSet):
    queryset = ShortenedUrls.objects.order_by("-created_at")
    serializer_class = UrlListSerializer
    permission_classes = [permissions.IsAuthenticated]  # permissions.IsAdminUser

티켓이 있어야 입장이 가능함 :)

Diana Titenko 님의 사진, 출처: Pexels