2016-06-02 9 views
0

Django 1.9.6.Anonyme Benutzer umleiten, um sich einzuloggen (zeige ihnen nichts)

Ich möchte die gesamte Website von anonymen Benutzern deaktivieren. Anonyme Benutzer werden immer zur Anmeldeseite weitergeleitet.

Ich habe eine allgemeine Ansicht erstellt. Das Problem ist, dass Subklassen von GeneralView kann nicht nur eine Vorlage machen, aber einige Berechnungen oder einfach nur seine verschiedener Arten ausführen: Detail, Listview usw.

class GeneralView(View): 
    def get(self, request, template): 
     if not request.user.is_authenticated() and request.user.is_active:    
      return redirect("auth_login") 
     else: 
      return render(request, template) 

Wenn ich zu erben versuche, wird der Code plump:

class HomePageView(GeneralView): 
    def get(self, request, template): 
     super().get(self, request) 

Nun, was kann ich hier tun? Ich bekomme die Fehlermeldung, dass meine Methode get HttpResponse nicht zurückgibt.

Ich kann Methode der Oberklasse umschreiben, um Statuscode zurückzugeben. Dann überprüfen Sie es in der Unterklasse. Aber das scheint Müll zu sein.

Mit anderen Worten bin ich in den Wolken der Erbschaft verloren. Könntest du mir hier einen Kick geben, wie man anonyme Benutzer immer zur Login-Seite umleitet, während eingeloggte User alles sehen können.

Vielen Dank im Voraus.

+0

Mögliches Duplikat [Beste Art und Weise Djangos login \ _required der Standard zu machen] (http://stackoverflow.com/questions/2164069/best-way-to-make-djangos-login-required-the- Standard) – Sayse

Antwort

2

lösen Sie sollten die UserPassesTestMixin dafür nutzen könnten.

from django.core.urlresolvers import reverse_lazy 

class GeneralView(UserPassesTestMixin, View): 

    def test_func(self): 
     # I assume you missed out the brackets in your question and actually wanted 'if not (request.user.is_authenticated() and request.user.is_active)' 
     return request.user.is_authenticated() and request.user.is_active 

    login_url = reverse_lazy('auth_login') 

Die mixin überschreibt dispatch, so müssen Sie super() nicht anrufen, wenn Sie get() Ihrer Ansicht nach außer Kraft setzen.

class HomePageView(GeneralView): 
    def get(self, request): 
     ... 
0

Ich denke, dass Ihr Fehler für Get-Methode, die nicht zurückkehrt, nicht zu einer Rückgabeanweisung gehört. in der Tat, sollten Sie in get-Methode des Kindes Klasse tun:

class HomePageView(GeneralView): 
    def get(self, request, template): 
     return super().get(self, request) 

, dass der Fehler

+0

Vielen Dank für den Kommentar. Aber ich kann die Idee immer noch nicht verstehen. Wo ist die Geschäftslogik von HomePageView? Es wird nur zurückgeben, was die Oberklasse zurückgibt. Ich würde gerne in der Oberklasse bleiben und nur nach dem Login suchen. Mit anderen Worten, die andere Bedingung sollte überhaupt nicht in der Oberklasse sein. In Bezug auf die besondere Geschäftslogik von Unterklassen. – Michael

+0

Sie können die Logik in eine andere Funktion einfügen und sie im else der Superklasse aufrufen. Dann können Sie diese Funktion in jeder der untergeordneten Klassen einfach überschreiben. – Nikign