django 익명 사용자 접근 제한 및 방향 변경
12748 단어 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 클래스의 사용과 사용자 정의, 마지막으로 로그인의 방향을 바꾸고 이동을 실현합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.