2010-10-05 4 views
9

Ich möchte verschiedene Sitzungen für die Django Admin-Schnittstelle und Anwendungen selbst haben, um als Admin auf der Admin-Oberfläche und als Standardbenutzer für die Anwendung anmelden können.Verschiedene Sitzungen für Admin und Anwendungen in Django

Irgendwelche Ideen, wie man das erreicht?

P.S. Sicher, kann ich 2 verschiedene Web-Browser-Instanzen verwenden, andere Möglichkeiten?

+0

Klingt interessant, weil es auch Ihnen die Gelegenheit geben sollte Frontend/Backend in verschiedenen Sprachen ... –

+0

ich bezweifle, dass dies möglich ist, mit django.contrib anzuzeigen .auth Ich erwarte, dass Sie Ihre eigene Lösung schreiben müssen, was viel mehr Arbeit bedeutet, als nur zwei verschiedene Browser-Instanzen zu verwenden (oder den privaten Modus Ihres Browsers zu verwenden, z. Chrome Incognito - http://www.google.com/support/chrome/bin/answer.py?hl=de&answer=95464). –

+1

Es sollte möglich sein, dies mit verschiedenen Sitzungscookies/Session Keys für Front- und Backend arbeiten zu lassen ... Ich denke, du müsstest deine eigene Session-Middleware machen, die prüft, ob es eine Admin-Anfrage ist oder nicht und zwei verschiedene behandelt cookies ... –

Antwort

6

Die Art, wie ich das in der Vergangenheit gelöst habe, ist, zwei verschiedene URLs zu haben. www.example.com und admin.example.com. Da die Sitzungen in Cookies gespeichert sind und die Cookies domänenspezifisch sind, können Sie beide gleichzeitig verwenden.

+0

Dies ist eine gute Lösung, die wenig Hacker außerhalb des 'urls.py'-Setups und einer Subdomain in Ihrer DNS-Zonendatei erfordert! – jathanism

+0

Wenn dies Ihre Frage beantwortet, bitte markieren Sie es als die Antwort, wenn es nicht bitte stellen Sie alle Follow-up-Fragen und ich werde Follow-up. – Wraithan

+0

In der Produktion ist es am elegantesten. – HardQuestions

1

Sie können dies auch erreichen mit zwei (sehr leicht unterschiedlichen) Einstellungsdateien, die jeweils einen unterschiedlicher Sitzungsschlüssel Name:

In settings_app.py:

SESSION_COOKIE_NAME = 'mysite_app' 

In settings_admin.py:

SESSION_COOKIE_NAME = 'mysite_admin' 

Ich fand es nützlich, verschiedene urls.py Dateien auch zu haben; Obwohl dies nicht unbedingt notwendig ist, hilft es bei der Trennung von Bedenken.

3

Ich wollte nur die Verwendung der vorgeschlagenen Lösung von Bernhard Vallant fördern. Es dauert 10 Minuten zu implementieren und zu testen. Greifen Sie einfach auf die SessionMiddleware-Implementierung, erstellen Sie Ihre eigene Version und ersetzen Sie die Einstellungen. SESSION_COOKIE_NAME beginnt je nach Anforderungspfad mit der Admin-URL und ersetzt die django.contrib.sessions.middleware.SessionMiddleware-Middleware durch Ihre neue in Ihren Einstellungen. py

import time 
from django.utils.cache import patch_vary_headers 
from django.utils.http import cookie_date 
from django.utils.importlib import import_module 
class AdminCookieSessionMiddleware(object): 

    def cookie_name(self, request): 
     if request.path.startswith(u'/admin'): 
      return settings.ADMIN_SESSION_COOKIE_NAME 
     return settings.SESSION_COOKIE_NAME 

    def process_request(self, request): 
     engine = import_module(settings.SESSION_ENGINE) 
     session_key = request.COOKIES.get(self.cookie_name(request), None) 
     request.session = engine.SessionStore(session_key) 

    def process_response(self, request, response): 
     """ 
     If request.session was modified, or if the configuration is to save the 
     session every time, save the changes and set a session cookie. 
     """ 
     try: 
      accessed = request.session.accessed 
      modified = request.session.modified 
     except AttributeError: 
      pass 
     else: 
      if accessed: 
       patch_vary_headers(response, ('Cookie',)) 
      if modified or settings.SESSION_SAVE_EVERY_REQUEST: 
       if request.session.get_expire_at_browser_close(): 
        max_age = None 
        expires = None 
       else: 
        max_age = request.session.get_expiry_age() 
        expires_time = time.time() + max_age 
        expires = cookie_date(expires_time) 
       # Save the session data and refresh the client cookie. 
       # Skip session save for 500 responses, refs #3881. 
       if response.status_code != 500: 
        request.session.save() 
        response.set_cookie(self.cookie_name(request), 
          request.session.session_key, max_age=max_age, 
          expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, 
          path=settings.SESSION_COOKIE_PATH, 
          secure=settings.SESSION_COOKIE_SECURE or None, 
          httponly=settings.SESSION_COOKIE_HTTPONLY or None) 
     return response 

und in settings.py

MIDDLEWARE_CLASSES = (
... 
#'django.contrib.sessions.middleware.SessionMiddleware', 
'path.to.your.AdminCookieSessionMiddleware', 
...) 
ADMIN_SESSION_COOKIE_NAME = 'somethingDifferentThanSESSION_COOKIE_NAME' 
+0

Es gibt jedoch ein Problem mit der obigen Lösung. Nicht alle Anfragen an die Admin-Schnittstelle werden mit dem Präfix '/ admin' gemacht. Wenn Sie zum Beispiel Grappelli für die Admin-Oberfläche verwenden, werden Ihre dynamischen m2m- oder Autocomplete-Verweise auf 'site.url/grappelli/lookup' gesetzt. Sie müssten das also auch in der Methode cookie_name vom obigen Beispiel behandeln, weil in diesem Fall die Suche nach verbotenen 403 Antworten für die Nachschlagevorgänge erfolgen würde. – pawelmech

+0

Es gibt auch ein Problem mit dem csrf-Token, Formulare sowohl auf der Admin- als auch auf der Nicht-Admin-Site werden es verwenden und überschreiben, daher sollte der csrf-cookie-Name auch zwischen Admin- und Nicht-Admin-Site variiert werden. – pawelmech

+0

Schöne Lösung für einige Entwicklungsumgebung. Übrigens denke ich, dass ich von SessionMiddleware besser weggehe. – Kixoms

Verwandte Themen