django 익명 사용자 접근 제한 및 방향 변경

12748 단어 django
일부 페이지에서 우리는 익명의 사용자가 방문할 수 있기를 원하지 않는다. 예를 들어 개인 페이지 등이다. 이런 페이지는 이미 로그인한 사용자만 방문할 수 있다.django에서도 우리는 비교적 많은 방식으로 실현할 수 있다.
가장 간단한 것은viewz에서 사용자를 판단하는 isauthenticated, 그러나 이런 방법도 상대적으로 서투르다. 가장 이상적인 우리는 당연히 이 요청이 우리view에 들어오기를 원하지 않는다. 그 전에 관련된response를 되돌려줄 수 있고,django는 사실 우리에게 관련 함수와 클래스를 봉해 주었다.
fbv 모드 기반loginrequired 장식기
def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, 
                    login_url=None):
    #            is_authenticated   
    pass

사용 방법도 간단합니다.
# fbv  
from django.contrib.auth.decorators import login_required
@login_required 
def user_info_view(request):
    #       
    pass

그러면 만약에 익명 사용자가 이 인터페이스에 방문한 후에login인터페이스로 방향을 바꿀 수 있다면 관련 매개 변수를 설정할 수 있기를 바랍니다.loginrequired 장식기는 기본적으로 settings를 읽습니다.LOGIN_URL을 이 페이지로 다시 지정합니다. 더 유연해지려면, 장식기에 관련 파라미터를 전달할 수도 있습니다.
# fbv  
@login_required(login_url='/login/', redirect_field_name='next')
def user_info_view(request):
    #       
    pass

login_url은 익명 사용자가 방문한 후 방향을 바꾸는 url입니다. 보통login의 페이지redirectfield_get 요청의 매개 변수입니다. 현재 페이지가/user/info/그러면 방향을 바꿀 URL을/login/?next=/user/info/이 매개 변수는 로그인 후 이 페이지로 바로 이동하는 데 사용할 수 있으며, 다음에 구체적으로 소개할 수 있습니다!
cbv 기반 LoginRequiredMixin 클래스
블로거는 일반적으로 cbv모드를 자주 사용하는데 이 모드에서 우리는 get과post방법을 다시 쓸 수 있고 이론적으로loginrequired 장식기로 이 두 가지 방법을 꾸미는 거예요.
# cbv  
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class UserInfoView(View):
    @method_decorator(login_required(login_url='/login/', redirect_field_name='next'))
    def get(self, request):
    #         
        pass

login_required는 함수 장식기,methoddecorator는 함수 장식기를 방법 장식기로 바꿀 수 있습니다.만약에 여기에post 요청이 있다면 이런 코드를 우리는 다시 한 번 써야 한다. 이렇게 하면 약간 불필요해 보인다. 우리는 클래스를 사용해서 실현했으니 당연히 클래스의 장점을 통해 실현해야 한다!LoginRequiredMixin을 상속합니다!
from django.contrib.auth.mixins import LoginRequiredMixin
class UserInfoView(LoginRequiredMixin, View):
    def get(self, request):
    #         
        pass

그렇다면 LoginRequiredMixin은 어떻게 이루어졌을까요?소스 코드 봐봐.
class LoginRequiredMixin(AccessMixin):
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated():
            return self.handle_no_permission()
        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

사실 이것은 디스패치 방법을 다시 썼습니다. 왜냐하면 우리는view를 계승했기 때문입니다. 사실 디스패치 함수는view의 논리를 알면 왜 이렇게 실현될 수 있는지 알 수 있습니다.URL에서 UserInfoView와 같은view 종류를 호출합니다.as_view () 방법, 디스패치 () 를 호출합니다. 이 방법은 분배기 역할을 합니다. get이 요청하면 get 방법을 호출하고,post가 요청하면post 방법을 호출합니다.그러면 디스패치에서 사용자가 로그인했는지 아닌지를 판단하는 것이 당연히 이 역할을 할 수 있다.그럼 디스패치만 다시 쓰는 거니까 우리도 스스로 실현할 수 있어!
#    LoginRequiredMixin
class LoginRequiredMixin(object):

    @method_decorator(login_required(login_url='/login/', redirect_field_name='next'))
    def dispatch(self, request, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

물론 스스로 이룰 필요가 있는지 없는지는 각자의 요구에 달려 있다.
리디렉션 및 점프
(login_url='/login/', redirect_field_name='next')

이 두 파라미터는 익명의 사용자가 로그인해야 할 페이지에 로그인하면login 으로 이동하는 방향을 바꾸고 이동하는 URL을 제공합니다.url, 이 get 요청은redirectfield_name 매개 변수, 값은'next'입니다.만약 그가 방문한 것이 개인 페이지라면,
http://127.0.0.1/login/?next=/user/info/

우리는 이 파라미터를 통해 로그인한 후에 개인 페이지로 바로 이동할 수 있다.
class LoginView(View):
    """
          
    """
    def get(self, request):
        #    next  ,   template , form      hidden     
        next = request.GET.get('next', '')
        return render(request, "login.html", {'next': next})

    def post(self, request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            user_name = request.POST.get("username", "")
            pass_word = request.POST.get("password", "")
            next = request.POST.get('next', '')
            user = authenticate(username=user_name, password=pass_word)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    if next:
                    #   next  ,         
                        return HttpResponseRedirect(next)
                    #       index  
                    return HttpResponseRedirect(reverse('index'))
                else:
                    return render(request, "login.html", {"msg": "     "})
            else:
                    return render(request, "login.html", {"msg": "        "})
        else:
            return render(request, "login.html", {"login_form": login_form})
# login.html template form   
<input name="next" type="hidden" value="{{ next }}"/>

일반 페이지의 로그인 점프 문제
일반 페이지도 로그인한 후에 원래의 페이지로 돌아가는 것을 실현하려면 매우 간단합니다. Request에 path 파라미터가 있습니다. 이것은 현재 페이지를 표시합니다. 우리는login인터페이스로 넘어가서 이 파라미터를 가져오면 됩니다.
# template
<a class="loginbtn" href="/login/?next={{ request.path }}">  a>
<a class='logoutbtn' href="/logout/?next={{ request.path }}"  </a>
<a class='registerbtn' href="/register/?next={{ request.path }}"  </a>

login의 실현 논리는 위와 같다. 사실logout과 등록 인터페이스의 실현 논리도 마찬가지다.
# logout
class LogoutView(View):
    def get(self, request):
        next = request.GET.get('next', '')
        logout(request)
        try:
            return HttpResponseRedirect(next)
        except:
            return HttpResponseRedirect(reverse('index'))

뒷말
이 편은 @login 에 중점을 두고 있다required 장식기의 사용과 Login Reqired Mixin 클래스의 사용과 사용자 정의, 마지막으로 로그인의 방향을 바꾸고 이동을 실현합니다!

좋은 웹페이지 즐겨찾기