django Klassenansicht mit Dekorateur und Sitzungen
Frage
Ich versuche, einige meiner django Ansichten von Funktion basiert Blick auf Klasse basierte Ansichten über zu konvertieren, und ich habe in ein kleines Problem führen.
Meine OO Art von schwach ist und ich denke, das Problem ist, dass ich den Überblick verloren haben, wo die Dinge laufen.
Ich habe eine benutzerdefinierte Login-Dekorateur, die ich auf den Ansichten müssen so habe ich ...
Zuerst habe ich die View-Klasse aus diesem Beispiel http://www.djangosnippets.org/snippets/760/
Dann ist meine Ansicht Klasse sieht wie folgt aus ...
class TopSecretPage(View):
@custom_login
def __call__(self, request, **kwargs):
#bla bla view stuff...
pass
Das Problem ist, dass mein Dekorateur nicht request.session aus irgendeinem Grunde zugreifen kann ...
Mein Dekorateur sieht wie folgt aus ...
def myuser_login_required(f):
def wrap(request, *args, **kwargs):
# this check the session if userid key exist,
# if not it will redirect to login page
if 'field' not in request.session.keys():
return wrap
Ich denke, es ist etwas einfach, dass ich so vielen Dank für Ihre Geduld jeder bin fehlt!
UPDATE: Ok also hier ist der Fehler, den ich bekommen ...
"ViewDoesNotExist. Versuchte TopSecretPage in Modul projectname.application.views Fehler war: Typ Objekt 'TopSecretPage' hat kein Attribut 'Session'"
ich den Dekorateur auch vereinfacht wie folgt aussehen ....
def myuser_login_required(request, *args, **kwargs):
# this check the session if userid key exist,
# if not it will redirect to login page
if 'username' not in request.session.keys():
return HttpResponseRedirect(reverse("login-page"))
return True
Lösung
Das Problem ist, dass Ihr Wrapper „Anforderung“ als erstes Argument erwartet, sondern eine Methode für eine Klasse nimmt immer „Selbst“ als erstes Argument. Also in Ihrem Dekorateur, es was denkt, ist das Request-Objekt selbst eigentlich TopSecretPage ist.
Entweder Vinay oder Artran Lösungen funktionieren sollte, so will ich sie nicht wiederholen. Ich dachte, eine klarere Beschreibung des Problems hilfreich sein könnte.
Andere Tipps
Der richtige Weg, dies für jeden Dekorateur einer klassenbasierten Ansicht Methode angewandt zu tun ist, django.utils.decorators.method_decorator()
zu verwenden. Ich bin nicht sicher, wenn method_decorator () eingeführt wurde, aber hier ist ein Beispiel / Update in dem Django 1.2 Release notes . Verwenden Sie es wie folgt aus:
from django.utils.decorators import method_decorator
class TopSecretPage(View):
@method_decorator(custom_login)
def __call__(self, request, **kwargs):
#bla bla view stuff...
pass
Dieses Problem hat sich vor . Eine Lösung ist enthalten, die für Sie arbeiten könnte.
Update: Beispiel Verfahren mit Dekorateur:
class ContentView(View):
# the thing in on_method() is the actual Django decorator
#here are two examples
@on_method(cache_page(60*5))
@on_method(cache_control(max_age=60*5))
def get(self, request, slug): # this is the decorated method
pass #in here, you access request normally
Statt den Dekorateur auf der Ansicht verwenden Sie die URL schmücken könnten.
Zum Beispiel in urls.py:
from my_decorators import myuser_login_required
from my_views import TopSecretPage
urlpatterns = patterns('',
(r'^whatever-the-url-is/$', myuser_login_required(TopSecretPage), {}),
)
Sie müssen möglicherweise mit, dass ein wenig spielen, aber es ist richtig.
Dies ist effektiv ein Duplikat Django - Richtige Art und Weise zu geben Argumente zu CBV Dekorateure? die beschreibt den richtigen Weg, dies anzugehen. Der richtige Weg, dies für django tun 1.9 ist wie folgt:
@method_decorator(myuser_login_required(), name='dispatch')
class TopSecretPage(View):
..