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
War es hilfreich?

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):
    ..
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top