2016-06-29 16 views
-1

Es tut mir leid, wenn die Frage sehr offensichtlich ist, aber ich bin noch neu in Django.Django Login Require Probleme

Ich habe Ausblick:

import logging 

@login_required(login_url='/accounts/login/') 

def index(request): 
     return render(request, 'post.html', {}) 

def new(request): 
    return render(request, 'post-add.html',) 

Die Anmeldung korrekt weiterleitet, wenn ich Seite POST gehen, aber wenn ich zu POST ADD bekam ist die Anmeldung nicht erforderlich.

Muss ich die Anmeldung korrekt verwenden?

Antwort

0

Sie müssen für die @login_required Dekorateur zu jeder sehen Sie Login erforderlich sein soll für:

@login_required(login_url='/accounts/login/') 
def index(request): 
     return render(request, 'post.html', {}) 


@login_required(login_url='/accounts/login/') 
def new(request): 
    return render(request, 'post-add.html', {}) 
+1

Es wäre keine gute Idee, die Login-URL als String in jeder Ansicht anzugeben. Vor allem, wenn es auf den Standard django gesetzt Einstellung sowieso – Sayse

1

Wenn Sie umleiten möchten, wenn Sie versuchen, „post-add“ ohne Login zu öffnen, müssen Sie einen anderen Dekorateur (@login_required (login_url = '/ accounts/login /') ).

+0

Danke :) Gibt es eine Möglichkeit automatisch alle Seiten anmelden überall ohne Hinzufügen des Dekorateur erforderlich werden? – user43506

+0

Nein, das glaube ich nicht. Aber Sie können die Standard-Login-URL in der Einstellungsdatei festlegen, und Sie können einfach Decorator (@login_required) hinzufügen. Das sieht sehr einfach aus. – Lincoln

0

Wie andere darauf hingewiesen haben, müssen Sie den Anmeldedecorator für jede Ansicht verwenden, für die eine Authentifizierung erforderlich ist.

Sie können es wiederverwenden, indem sie einfach wie diese Verpackung:

auth = login_required(login_url='/accounts/login/') 

@auth 
def index(request): 
    return render(request, 'post.html', {}) 

@auth 
def new(request): 
    return render(request, 'post-add.html',) 

Oder wenn Sie klassenbasierte wie Ansichten, würde ich es vorziehen, diese:

class AuthMixin(object): 
    @method_decorator(login_required(login_url='/accounts/login/')) 
    def dispatch(self, *args, **kwargs): 
     return super(AuthMixin, self).dispatch(*args, **kwargs) 

class IndexView(AuthMixin, TemplateView): 
    template_name = 'post.html' 

class AddView(AuthMixin, TemplateView): 
    template_name = 'post-add.html' 

es zu vereinfachen, ein bisschen mehr, Sie können das Mixin von TemplateView übernehmen und es als eine einzige Basisklasse für alle Ihre für die Anmeldung erforderlichen Ansichten verwenden.

Auch wäre es eine gute Idee - mit beiden Ansatz - die Login-URL von den Einstellungen abzurufen.