2016-05-21 5 views
1

Haben Sie das folgende Problem; Ich folge Django von Beispiel, Antonio Mele. Die Übung hier ist, Benutzeranmeldung einzurichten und abzumelden.Verwenden Sie die Standardansichten von contrib.auth. Wenn der Code im Buch verwendet wird. Die Abmeldesicht ist die Abmeldung der Verwaltungsseite. scheint das gleiche Problem zu sein wie hier beschriebenDjango kann die Abmeldevorlage nicht rendern

django logout redirects me to administration page. Habe alles versucht, kein Erfolg

Ich habe an diesem Problem gearbeitet. Mein Code funktioniert jetzt, da die Admin-Vorlage nicht mehr gerendert wird. Ich kann jedoch immer noch meine eigene logout.html nicht verwenden. Ich kann auf meine eigene login.html umleiten ... aber nicht auf die logout.html. Die Abmeldung selbst funktioniert. Der Benutzer kann sich anmelden und nur dieses Problem mit den Vorlagen ausschließen. Ich jetzt erhalten nur ein Browser-Fehler

Die Seite ist nicht Umleiten richtig hat Iceweasel festgestellt, dass die> Server die Anfrage in einer Art und Weise für diese Adresse umleiten, die will> nie Problem complete.This kann manchmal verursacht werden Deaktivieren oder> Ablehnen der Annahme von Cookies.

überprüft die Cookies csrf Token akzeptiert

kein Zurückverfolgungs verfügbar keine Fehler :-(

Wenn ich den Code unten verwenden sehen können, alle Arbeiten mit einer Ausnahme. Ich bin umgeleitet zu Logout zu der Django Administration Logout-Vorlage, und nicht meine eigene Logout.html .... Dies ist, wenn der Koede im Buch verwendet .... Mein eigener modifizierter Code, mit einer separaten Logout-Funktion, funktionierte ebenfalls nicht und erzeugte einen maximalen Rekursonfehler Das Bearbeiten von URLS.PY stoppt das Rendern der Admin-Vorlage, aber der geänderte Code scheint ein Problem in den URLs zu haben d. h.

DAS FUNKTIONIERT NICHT !!!!!

url(r'^logout/$', 'django.contrib.auth.views.logout',{'next_page': '/account/logout'}, name='logout'), 

DAS FUNKTIONIERT PERFEKT !!!!

url(r'^logout/$', 'django.contrib.auth.views.logout',{'next_page': '/account/login'}, name='logout'), 

Der Code aus dem Buch ist als

FROM BOOK SETTINGS.PY

folgt
from django.core.urlresolvers import reverse_lazy 

LOGIN_REDIRECT_URL = reverse_lazy('dashboard') 
LOGIN_URL = reverse_lazy('login') 
LOGOUT_URL = reverse_lazy('logout') 

VOM BUCH VIEWS.PY

from django.http import HttpResponse 
from django.shortcuts import render, redirect 
from django.contrib.auth import authenticate, login, logout 
from django.contrib.auth.decorators import login_required 
from django.contrib import messages 
from .forms import LoginForm 

@login_required 
def dashboard(request): 
    return render(request, 'account/dashboard.html', {'section': 'dashboard'}) 


def user_login(request): 
    if request.method == 'POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      user = authenticate(username=cd['username'], password=cd['password']) 
      if user is not None: 
       if user.is_active: 
        login(request, user) 
        return HttpResponse('Authenticated successfully') 
       else: 
        return HttpResponse('Disabled account') 
      else: 
       return HttpResponse('Invalid login') 
    else: 
     form = LoginForm() 
    return render(request, 'account/login.html', {'form': form}) 

VOM BUCH MAIN URLS.PY

from django.conf.urls import include, url 
from django.contrib import admin 



urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^account/', include('account.urls')), 
    ] 

MYAPP (Konto) URLS.PY

from django.conf.urls import url 
from . import views 


urlpatterns = [ 
    # url(r'^login/$', views.user_login, name='login'), 
    url(r'^$', views.dashboard, name='dashboard'), 



    # login/logout urls 
    url(r'^login/$', 'django.contrib.auth.views.login', name='login'), 
    url(r'^logout/$', 'django.contrib.auth.views.logout', name='logout'), 
    url(r'^logout-then-login/$', 'django.contrib.auth.views.logout_then_login', name='logout_then_login'), 

MY MODIFIFED CODE

Ich habe nun auch eine separate Logout-Definition in meiner Sicht ist und jetzt passieren auch einen {key: value} Paar { 'next_page': '/ account/logout'}.

wenn die Abmelde def verwendet wird und in den URLs zugeordnete Datei es in Zeile Logout (request)

def logout(request): 
    logout(request) 
    request.session.flush() 
    request.user = AnonymousUser 
    # Redirect to a success page. 
    return HttpResponseRedirect(request,'/account/logout.html',context_instance = RequestContext(request)) 

einen maximalen Rekursion Fehler erzeugt, ohne dass dies der einzige Fehler def erzeugte

""“ Die Seite leitet nicht richtig um

"" "Iceweasel hat festgestellt, dass der Server die Anforderung für diese Adresse auf eine Weise umleitet, die nie abgeschlossen wird.

This problem can sometimes be caused by disabling or refusing to accept cookies."""" 

""“ ich Cookies im Browser aktiviert ist, und sehen Sie die csrf_token

Für mich akzeptiert das Merkwürdige ist, dass, wenn der Code: { 'next_page': '/ account/Logout' } geändert zu { 'next_page': '/ account/login'} alles perfekt funktioniert versucht hat, alle Vorschläge gefunden, bei einem Verlust ist jede Hilfe dankbar ....

MEIN CODE VIEWS.PY

.
from django.shortcuts import render 
from django.http import HttpResponse, HttpResponseRedirect 
from django.contrib.auth import authenticate, login, logout 
from .forms import LoginForm 
from django.contrib.auth.decorators import login_required 
from django.template import RequestContext 
from django.contrib.auth.models import User 


# Create your views here. 

@login_required 
def dashboard(request): 
    return render(request, 'account/dashboard.html',{'section': 'dashboard' }) 




def user_login(request): 
    cd = None 
    if request.method=='POST': 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      user = authenticate(username=cd['username'], 
           password=cd['password']) 
      if user is not None: 
       if user.is_active: 
        login(request, user) 
        return HttpResponse('Authenticated successfully') 
       else: 
        return HttpResponse('Disabled Account') 
      else: 
       return HttpResponse('Invalid Login') 
    else: 
     form = LoginForm() 
    return render(request, 'account/login.html',{'form': form},context_instance = RequestContext(request)) 


def logout(request): 
    logout(request) 
    request.session.flush() 
    request.user = AnonymousUser 
    # Redirect to a success page. 
    return HttpResponseRedirect(request,'/account/logout.html',context_instance = RequestContext(request)) 

MEIN CODE Konto/urls.py

from django.conf.urls import url, patterns 
from . import views 



urlpatterns = [ 
       # post views 
       #url(r'^login/$', views.user_login, name='login'), 
       # login/logout urls 
       url(r'^$', views.dashboard, name='dashboard'), 
       url(r'^login/$', 'django.contrib.auth.views.login', name='login'), 
       url(r'^logout/$', 'django.contrib.auth.views.logout',{'next_page': '/account/logout'}, name='logout'), 
       url(r'^logout-then-login/$','django.contrib.auth.views.logout_then_login', name='logout_then_login'), 

       ] 

MEIN CODE MAIN URLS.PY

from django.conf.urls import include, url 
from django.contrib import admin 


urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^account/', include("account.urls")), 
] 

MyCode SETTINGS.PY

LOGIN_REDIRECT_URL = reverse_lazy('dashboard') 
LOGIN_URL = reverse_lazy('login') 
LOGOUT_URL = reverse_lazy('logout') 

INSTALLED_APPS = (
    'account', 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 

) 

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
) 


# urlpatterns += patterns('django.contrib.auth.views', 
#   #url(r'^login/$', 'login', { 'template_name': 'registration/login.html'}, name='login'), 
#   #url(r'^logout/$', 'logout', { 'template_name': 'registration/logout.html', 'next_page':reverse('index') }, name='logout'), 
# ) 

MyCode
logout.html

{% extends "base1.html" %} 

{% block title %}Logged Out{% endblock %} 


{% block content %} 
<h1> 
    Logged Out 
</h1> 
<p> 
    You have been successfully logged out. You can <a href="{% url "login" %}">Log-in again</a> 
</p>{% endblock %} 

MyCode base1.html

{% load staticfiles %} 
<!DOCTYPE html> 
<html> 
<head> 
    <title>{% block title %}{% endblock %}</title> 
    <link rel="stylesheet" type="text/css" href="{% static 'css/base.css' %}"> 
</head> 
<body> 


<div id="header"> 
    <span class="logo"> 
     BookMarks 
    </span> 
{% if user.is_authenticated %} 
<ul class="menu"> 

<li {% if section == "dashboard" %}class="selected"{% endif %}> 
<a href="{% url 'dashboard' %}">My dashboard</a> 
</li> 
<li {% if section == "images" %}class="selected"{% endif %}> 
<a href="#">Images</a> 
</li> 
<li {% if section == "people" %}class="selected"{% endif %}> 
<a href="#">People</a> 
</li> 
</ul> 
{% endif %} 

{%if user.is_authenticated %} 
<span class="user"> 


Hello {{ user.first_name }} {{ user.last_name }}, 
<a href="{% url 'logout' %}">Logout</a> 

{% else %} 
<a href='{% url "login" %}'>Log-in</a> 
{% endif %} 
</span> 
</div> 

<div id="content"> 
    {% block content %} 
    {% endblock %} 
</div> 

</body> 

</html> 
+0

Mögliches Duplikat von [django logout leitet mich zur Verwaltungsseite weiter] (http://stackoverflow.com/questions/15467831/django-logout-redirects-me-to-administration-page) – Louis

Antwort

2

Sie verwenden contrib.auth ‚s logout Blick in Ihre urls.py. Diese Ansicht leitet zu der von 'next_page' angegebenen URL um. Sie geben '/account/logout' als next_page - wo wiederum die logout Ansicht aufgerufen wird!

Das führt zu einem (unendlich) redirect loop: die Ansicht leitet sich selbst um.

Versuchen Sie stattdessen: in der eigenen logout Ansicht:

# no redirecting here! 
return render(request, 'account/logout.html', 
       context_instance=RequestContext(request)) 

eine URL für diese Ansicht hinzufügen in account/urls.py:

url(r'^post-logout/$', logout, name='post-logout'), 
# logout being your own view 

liefern dann diese URL als 'next_page' die eigentlichen (auth) Abmeldung:

url(r'^logout/$', 'django.contrib.auth.views.logout', 
    {'next_page': '/account/post-logout'}, name='logout'), 
+0

Wenn der next_page-Wert entfernt wird, wird er zur Django-Admin-Logout-Vorlage weitergeleitet und nicht zur Vorlage innerhalb des Projekts ... also einfach zurück zum ursprünglichen Problem .. Wenn die URL-Map für die Logout-Ansicht definiert ist, generiert sie einen maximalen Rekursionsfehler –

+0

Nun, ** ** render ** eine Vorlage, aber ** Redirect ** zu einer Ansicht. Also in Ihrem eigenen 'Logout' (der Post-Logout) Ansicht, sollten Sie die Vorlage rendern, nicht versuchen, um es zu leiten. Und dann, fügen Sie eine URL für die "urls.py", eine, die anders ist als die für die tatsächliche Abmeldesicht verwendet. Diese URL, Sie dann zu Verfügung stellen als 'nächste Seite'. – schwobaseggl

0

T Die Lösung des Problems besteht darin, die URL wie folgt abzubilden:

URL (r 'logout/$', 'django.contrib.auth.views.logout', {'template_name': 'account/logout.html' ,} name = ‚Logout‘),

+0

@schwobaseggl Vielen Dank für deine Vorschläge, setze mich auf den richtigen Weg :-) –

0

ich gleiches Problem hatte, aber dann hielt ich

lesen „Wenn Sie sehen die Abmelde Seite der Website Django Verwaltung statt Ihre eigenen ausloggen Seite , überprüfen Sie die Einstellung INSTALLED_APPS Ihres Projekts und stellen Sie sicher, dass django.contrib.admin nach der Kontoanwendung kommt. Beide Vorlagen befinden sich im selben relativen Pfad, und der Django-Vorlagenlader verwendet den ersten, den er findet. "