2011-01-17 9 views
2

Wie installiere ich Snippets in django? (Speziell this)Installation von Snippets

Ich habe die Datei /{project}/snippets/EnforceLoginMiddleware.py und ich habe eine beliebige Anzahl von Permutationen innerhalb MIDDLEWARE_CLASSES versucht, es zu laden sowie django snippets install ohne Erfolg googeln :(

Jede Hilfe wäre dankbar :)

PS (Warum kann ich keine Dokumentation oder Beispiele für die Installation von Snippets finden. Vielleicht bin ich nur ein schlechtes googler)

Antwort

5

"Snippets" zeigt nicht auf ein bestimmtes Element von Django, es bedeutet nur: Hier ist ein Stück Code für Sie zu verwenden. In diesem Fall ist es eine Middleware, ein spezifisches Django-Modul, das vor und nach einer Web-Anfrage aufgerufen wird. Read django docs benötigt, wenn

Ich benutze diese Middleware auch nur alles rief in einer Datei middleware.py in die Hauptanwendung -Ordner (jede App-Ordner tun, da diese App in INSTALLED_APPS erwähnt wird)

Dann fügen Sie diese Zeilen in Ihre settings.py Datei:

MIDDLEWARE_CLASSES = (
    #...all others middleware, on the last line, paste : 
    'main.middleware.EnforceLoginMiddleware', 
) 

Beachten Sie, dass hier die app, wo ich die Datei setzen main genannt wird, kann bei Ihnen anders benannt werden.

Vergessen Sie nicht, das docstring des Snippets zu lesen:

Middlware class which requires the user to be authenticated for all urls except 
those defined in PUBLIC_URLS in settings.py. PUBLIC_URLS should be a tuple of regular 
expresssions for the urls you want anonymous users to have access to. If PUBLIC_URLS 
is not defined, it falls back to LOGIN_URL or failing that '/accounts/login/'. 
Requests for urls not matching PUBLIC_URLS get redirected to LOGIN_URL with next set 
to original path of the unauthenticted request. 
Any urls statically served by django are excluded from this check. To enforce the same 
validation on these set SERVE_STATIC_TO_PUBLIC to False. 
+0

Vielen Dank! – Sevenearths

1

In Ihrem Beispiel Ihr neuer Eintrag MIDDLEWARE_CLASSES zu l hätte ook like '{project} .snippets.EnforceLoginMiddleware.EnforceLoginMiddleware' (durch den Paketnamen für Ihr Projekt ersetzen).

Stellen Sie sicher, dass Ihr Snippets-Ordner auch eine __init__.py-Datei enthält!

P.S .: Das liegt wahrscheinlich daran, dass es bei offiziellen Komponenten in Django keine "Schnipsel" gibt. Sie sind normalerweise einfache Python-Codefragmente und müssen als solche behandelt werden. Djangosnippets ist nur eine Seite, wo du Django-Code (auch Schnipsel genannt) veröffentlichen und teilen kannst.

2

Sie müssen sicherstellen, dass auf Ihrem PYTHONPATH (sys.path) Ihr Snippet ist oder, dass das Snippet innerhalb eines Moduls ist, das existiert auf deinem PYTHONPATH.

Wenn Sie in diesem Fall eine __init__.py Datei zu Ihrem Snippets-Ordner hinzufügen, behandelt dies den Snippets-Ordner als Modul und Sie können from snippets.EnforceLoginMiddleware import EnforceLoginMiddleware tun. Ich denke, das ist der entscheidende Schritt, den Sie verpassen.

würde Ihre Middleware-Klassen dann wie folgt aussehen:

MIDDLEWARE_CLASSES = (..., 'snippets.EnforceLoginMiddleware.EnforceLoginMiddleware') 
+0

Danke. Ihr Recht, aber ich entschied, das Modul in die Hauptdatei 'middleware.py' im Stammverzeichnis des Projektverzeichnisses aufzunehmen, da es systemweit angewendet wird – Sevenearths

+1

@Sevenearths, genau dort sollte es auch sein. Ich hatte ein bisschen Mühe herauszufinden, wie man Dateien aus beliebigen Verzeichnissen zuerst einfügt. Groking Module und PYTHONPATH können auf den ersten Blick verwirrend sein. –