[Django] login_required 3가지 구현 방법 (AOP, Decorator)

반응형

django Logo

 

 
Contents

    1. 배경

    장고에서는 다양한 방법으로 로그인한 유저만 허용하도록 할 수 있습니다. 예를 들어, 커뮤니티 웹사이트에서 글 목록까진 볼 수 있지만, 글을 보려면 로그인해야 볼 수 있게 할 수 있습니다. 이는 장고의 View단에서 구현됩니다. 유저가 로그인했는지를 판단하는 3가지 방법을 알아보겠습니다.

    2. 방법

    1) request.user로 판단

    def index(request: HttpRequest) -> HttpResponse:
        if not request.user.is_authenticated:
            return redirect("/accounts/login/")
        qs = Post.objects.all()
        return render(request, "blog/index.html", context={"post_list": qs})

    * 코드 설명

    index함수는 view의 함수로 request를 input으로 받습니다. user가 로그인된 경우, request.user.is_authenticated는 True를 반환합니다. 이를 이용해서 조건문으로 로그인되지 않은 경우 login 화면으로 리다이렉트 하는 코드입니다.

     

    2) @login_required로 판단

    데코레이터 문법을 활용한 방법입니다. 데코레이터를 활용한 방법을 AOP(Aspect Oriented Programming:관점 지향 프로그래밍)이라고 합니다. AOP는 쉽게말해, 보기 좋게 프로그래밍하는 것입니다. 데코레이터로 함수/클래스를 감싸는 형태로 필요한 기능을 수행하기 때문입니다. 

    @login_required
    def post_detail(request: HttpRequest, pk: int) -> HttpResponse:
        # post = Post.objects.get(pk=pk)
        post = get_object_or_404(Post, pk=pk)  # 해당 오브젝트가 없으면 404페이지로 보낸다.
        return render(request, "blog/post_detail.html", {"post": post})

    * 코드 설명

    데코레이터를 이용한 방법입니다. View에서 사용하고자 하는 함수위에 @login_required를 작성해주면 그 바로 아래의 함수에 대해 wrapper(래퍼) 역할을 하여 로그인된 경우만 아래 함수가 실행될 수 있도록 하고, 로그인하지 않은 상태로 아래 함수를 호출하게 되면 해당 유저는 로그인 화면으로 가게 됩니다. (클래스형 뷰에는 이를 쓸 수 없습니다.)

     

    3) login_required() 함수 사용

    post_new = login_required(
        CreateView.as_view(
            model=Post,
            form_class=PostForm,
            success_url="/blog/",
        )
    )

    * 코드 설명

    CreateView.as_view()라는 CBV(Class Based View)를 사용하는 경우는 함수/클래스를 정의하는 게 아니고, 정의된 클래스를 import 하여 사용하기 때문에 데코레이터를 사용하기 어렵습니다. 그럴 땐, login_required() 함수 내부에 CreateView.as_view() 함수를 작성하면, 해당 뷰 함수는 로그인된 경우만 호출됩니다.

     

     

     

    Reference
    1. django Logo: https://codecondo.com/jobs-for-django-developers/django-framework-logo/
    2. Content: 인프런 장고 강의 https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-%EC%84%A4%EA%B3%84%EC%B2%A0%ED%95%99-%EC%9E%85%EB%AC%B8/
     

    장고 설계철학으로 시작하는 파이썬 장고 입문 - 인프런 | 강의

    장고 개발을 위한 필수 파이썬 문법과 장고 설계철학에 대한 깊은 이해를 통해, 장고 웹개발을 제대로 시작해보세요., - 강의 소개 | 인프런...

    www.inflearn.com

    반응형

    댓글

    Designed by JB FACTORY