장고 : 로그인 후 이전 페이지로 리디렉션


175

로그인 기능이있는 간단한 웹 사이트를 여기에있는 것과 비슷합니다. 사용자는 익명 사용자로 사이트를 탐색 할 수 있어야하며 모든 페이지에 로그인 링크가 있습니다. 로그인 링크를 클릭하면 사용자가 로그인 양식으로 이동합니다. 로그인에 성공하면 사용자는 처음에 로그인 링크를 클릭 한 페이지로 되돌아 가야합니다. 어떻게 든 현재 페이지의 URL을 로그인 양식을 처리하는보기로 전달해야하지만 실제로는 작동하지 않을 것이라고 생각합니다.

편집 : 알아 냈습니다. 현재 페이지를 GET 매개 변수로 전달하여 로그인 양식에 연결 한 다음 '다음'을 사용하여 해당 페이지로 리디렉션했습니다. 감사!

편집 2 : 내 요청이 여기에 요청 된대로 내 설명이 명확하지 않은 것 같습니다 : 우리가 foo.html 페이지에 있고 로그인하지 않았다고 가정 해 봅시다. 이제 우리는 foo.html에 링크가되고 싶습니다. login.html로 이동하십시오. 거기서 로그인하여 foo.html로 다시 리디렉션 할 수 있습니다. foo.html의 링크는 다음과 같습니다.

      <a href='/login/?next={{ request.path }}'>Login</a> 

이제 다음과 같은 사용자 정의 로그인 뷰를 작성했습니다.

def login_view(request):
   redirect_to = request.REQUEST.get('next', '')
   if request.method=='POST':
      #create login form...
      if valid login credentials have been entered:
         return HttpResponseRedirect(redirect_to)  
   #...
   return render_to_response('login.html', locals())

login.html의 중요한 라인 :

<form method="post" action="./?next={{ redirect_to }}">

예, 거의 다 그렇습니다. 그것이 분명해지기를 바랍니다.


1
Django 로그인 항목이 귀하를 위해 처리한다고 생각합니다.
Dominic Rodger

답변:


151

이를 위해 추가로 볼 필요는 없습니다. 기능은 이미 내장되어 있습니다.

먼저 로그인 링크가있는 각 페이지는 현재 경로를 알아야하며, 가장 쉬운 방법은 요청 컨텍스트 프리 프로세서를 settings.py에 추가하는 것입니다 (첫 번째 4 개는 기본값 임). 그러면 각 요청에서 요청 오브젝트를 사용할 수 있습니다.

settings.py :

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.request",
)

그런 다음 템플릿에 로그인 링크를 추가하십시오.

base.html :

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a>

현재 페이지를 가리키는 로그인 페이지에 GET 인수가 추가됩니다.

로그인 템플릿은 다음과 같이 간단 할 수 있습니다.

registration / login.html :

{% block content %}
<form method="post" action="">
  {{form.as_p}}
<input type="submit" value="Login">
</form>
{% endblock %}

47
개인적 으로이 솔루션을 사용하지만 한 가지 수정 사항 request.path은 null 인 경우 실패 하므로 {% firstof request.path '/' %}요청 경로를 사용할 수없는 경우 사용자가 홈 페이지로 보내는 경우 그렇게 합니다.
jorelli

1
솔루션을 구현하려고 시도하지만 django.contrib.auth.views.login이 성공적으로 인증 된 후 사용자 인스턴스가 요청에 있지 않으므로 user.is_authenticated ()는 항상 False를 반환합니다. 어떤 도움?
juankysmith

3
@jorelli 위에 추가하면 이름이 지정된 URL을 <a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>대신 사용할 수 있습니다 .
hobbes3

12
또한 로그 아웃 한 후 사용자가 로그인했는지 확인해야합니다. 다시 말해, 사용자 로그인과 next유사 /accounts/logout/하고 즉시 로그 아웃되고 루프가 계속됩니다.
hobbes3

2
내가 장고 1.5에 로그인 폼에 다음을 추가 할 때 이것은 단지 일을 발견 : <이름 = "다음"값 = "숨겨진"입력 유형 = "{{다음}}"/>
엘리스 퍼시벌

28

이것은 "모범 사례"가 아닐 수 있지만 이전에 이것을 성공적으로 사용했습니다.

return HttpResponseRedirect(request.META.get('HTTP_REFERER','/'))

10
이 약점이있다 - 일부 사용자를 /의 브라우저는 통과 리퍼러가 꺼져
토 마즈 지린 스키를

4
사용자가 양식에 도착하여 정보를 작성한 다음 제출하는 경우에도 문제가 있습니다. 그런 다음 HTTP_REFERER는 양식 페이지의 URL이며 사용자가 처음 방문한 페이지의 URL이 아닙니다.
LaundroMat

25

매개 변수 / 값으로 전체 URL을 지원하려면 다음이 필요합니다.

?next={{ request.get_full_path|urlencode }}

그냥 대신 :

?next={{ request.path }}

실제로 이것은 좋은 생각이 아닙니다. 클릭 수가 너무 많으면 쿼리 문자열이 매우 길다는 것을 알 수 있습니다.
dspjm

14

Django의 내장 인증은 원하는 방식으로 작동합니다.

로그인 페이지에는 next로그인 후 리턴 할 페이지 인 쿼리 문자열이 포함됩니다 .

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required를 보십시오


4
글쎄, login_required 데코레이터는 내가 온 페이지로 '다음'을 설정하면 정상적으로 작동하지만 데코레이터를 사용하면 익명 사용자가 로그인 양식으로 바로 리디렉션되므로 사이트를 볼 수 없습니다. 나는 '다음'의 값을 사용자가 온 페이지의 URL로 설정하는 방법을 알아 내야한다고 생각합니다.
jörg

1

현재 페이지를 GET 매개 변수로 전달하여 로그인 양식에 연결 한 다음 '다음'을 사용하여 해당 페이지로 리디렉션했습니다. 감사!


1

같은 문제가 발생했습니다. 이 솔루션을 사용하면 일반 로그인보기를 계속 사용할 수 있습니다.

urlpatterns += patterns('django.views.generic.simple',
    (r'^accounts/profile/$', 'redirect_to', {'url': 'generic_account_url'}),
)

1

에서 registration/login.html(중첩 templates다음 줄을 삽입하면 페이지가 장고의 원래 관리자 로그인 페이지와 같은 렌더링 폴더) :

{% include "admin/login.html" %}

참고 : 파일은 위의 행만 포함해야합니다.


-1

views.login () 은 django docs를 참조하십시오 . 입력 양식에 '다음'값 (숨겨진 필드로)을 제공하면 로그인 성공 후 리디렉션됩니다.


예. 실제로는 다음 페이지에서 '다음'을 어떻게 설정합니까?
jörg

-3

당신은 또한 이것을 할 수 있습니다

<input type="hidden" name="text" value="{% url 'dashboard' %}" />

답변이 잘못되었지만 name = 'next'는 테스트 할 수없는 것 같습니다.
WeizhongTu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.