2017-02-14 4 views
1

Ich baue eine Django-Website, aber meine Abmeldung funktioniert nicht. Die Website besteht aus zwei Apps, der Haupt App, die öffentlich ist und der Student App, die privat ist. In meiner Student App habe ich die @login_required Dekorateur in jede Methode, mit Ausnahme der Abmelde-Methode. Aber wenn ich Sie auf die Abmelde Link in der Student App ist meine Seite nicht auf die Haupt weitergeleitet App, geht es in eine andere Ansicht in der Student app, und wenn ich die Seite neu zu laden, der Inhalt ist immer noch verfügbar, obwohl ich die @login_required Dekorateur gesetzt habe. Hier ist mein Code:Abmelden funktioniert nicht Django 1.9

Webseite/urls.py

from main_app import urls as main_urls 
from student_app import urls as std_urls 

urlpatterns = [ 
url(r'^index/', include(main_urls)), 
url(r'^student-area/', include(std_urls))] 

Webseite/settings.py

LOGIN_URL = '/index/login/' 
LOGIN_REDIRECT_URL = '/student-area/' 

main_app/urls.py

... 
urlpatterns = [ 
url(r'^$', views.index, name='index'), 
...] 

student_app/urls.py

... 
urlpatterns = [ 
url(r'^$', views.std_videos_view, name='student_area'), 
url(r'^(?P<video_key>[a-zA-Z0-9\_\.]+)/$', views.std_video_detail_view, name='video_detail'), 
url(r'^materials-std/$', views.std_material_view, name='materials_std_view'), 
url(r'^download-material/(?P<material_key>[a-zA-Z0-9\_\.]+)/$', views.std_material_download, name='download_material'), 
url(r'^sims/$', views.std_sim_view, name='sims_view'), 
url(r'^download-sim/(?P<sim_key>[a-zA-Z0-9\_\.]+)/$', views.std_sim_download, name='download_sim'), 
url(r'^contact/$', views.std_contact_view, name='std_contact'), 
url(r'^logout/$', views.user_logout, name='user_logout') 
] 

student_app/views.py

from django.contrib.auth import logout 
from django.shortcuts import redirect 
... 
def user_logout(request): 
    logout(request) 
    return redirect('index') 

student_app/templates/student_area.html

... 
<a href={% url 'user_logout' %} class="btn btn-default">Logout</a> 
... 

ich in dieser bin verloren Problem, danke im Voraus.

Antwort

2

Ihr video_detail URL-Muster entspricht /logout/. Django stoppt, sobald eine Übereinstimmung gefunden wird. Anfragen für /logout/ werden stattdessen in der Ansicht std_video_detail_view statt in der Ansicht user_logout behandelt.

Sie können dies beheben, indem Sie entweder die Regex für die video_detail URL so ändern, dass sie nicht kollidiert (z. B. ^videos/(?P<video_key>[a-zA-Z0-9\_\.]+)/$), oder indem Sie das Logout-URL-Muster über das Videodetailmuster verschieben.

+0

Sorry, ich habe das * return * nur in der Frage vergessen. Aber ich habe das $ in die Logout-URL gesetzt und nicht funktioniert. – Toshi

+0

Wenn das Problem durch ein fehlendes '$' verursacht wird, ist es eines der URL-Muster über dem Abmelde-URL-Muster. Ich habe 'user_logout' als Beispiel verwendet, weil Sie den Rest Ihrer URLs nicht angezeigt haben. – Alasdair

+0

Ich habe die Frage mit den anderen URLs bearbeitet, sorry für den Ärger. – Toshi