2010-10-05 8 views
9

Mi piacerebbe avere diverse sessioni per l'interfaccia di amministrazione Django e applicazioni stesse per essere in grado di accedere come amministratore per l'interfaccia di amministrazione e come utente standard per l'applicazione.sessioni differenti per admin e applicazioni in Django

Delle idee come ottenere questo?

P.S. Certo, posso utilizzare 2 diverse istanze del browser Web, in altri modi?

+0

Sembra interessante perché dovrebbe anche dare l'opportunità di vedere frontend/backend in diverse lingue ... –

+0

dubito che questo è possibile utilizzando django.contrib .auth , Mi aspetto che tu debba scrivere la tua soluzione, il che richiederà molto più lavoro rispetto all'utilizzo di 2 diverse istanze del browser (o utilizzando la modalità privata del tuo browser, ad es. Chrome in incognito: http://www.google.com/support/chrome/bin/answer.py?hl=it&answer=95464). –

+1

Dovrebbe essere possibile farlo funzionare con l'uso di diversi cookie di sessione/chiavi di sessione per front e backend ... Immagino che dovresti fare il tuo middleware di sessione, che controlla se si tratta di una richiesta di amministratore o meno e gestisce due diversi cookies ... –

risposta

6

Il modo ho risolto in passato è raggiungere 2 URL diversi. www.example.com e admin.example.com. Poiché le sessioni sono memorizzate in cookie e i cookie sono specifici del dominio, è possibile utilizzarli entrambi contemporaneamente.

+0

Questa è una buona soluzione che richiede poco hackery al di fuori dell'impostazione 'urls.py' e un sottodominio nel file di zona DNS! – jathanism

+0

Se questo ha risposto alla tua domanda, contrassegnala come risposta, se non ha risposto a eventuali domande di follow-up e provvederò a seguirle. – Wraithan

+0

In produzione è il modo più elegante. – HardQuestions

1

È inoltre possibile raggiungere questo obiettivo con due (leggermente diverso) Impostazioni file, ciascuno con una diversa sessione di nome chiave:

In settings_app.py:

SESSION_COOKIE_NAME = 'mysite_app' 

In settings_admin.py:

SESSION_COOKIE_NAME = 'mysite_admin' 

ho trovato utile avere urls.py diversi file di troppo; anche se non strettamente necessario, aiuta a separare le preoccupazioni.

3

Volevo solo per incoraggiare l'utilizzo di soluzione proposta di Bernhard Vallant. Occorrono 10 minuti per implementare e testare. Basta prendere l'implementazione SessionMiddleware per fare in modo che la propria versione sostituisca le impostazioni.SESSION_COOKIE_NAME a seconda che il percorso della richiesta inizi con URL admin o non e sostituisca il middleware django.contrib.sessions.middleware.SessionMiddleware con quello nuovo nelle impostazioni. 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 

e in settings.py

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

C'è un problema con la soluzione sopra però. Non tutte le richieste di interfaccia di amministrazione sono fatte con il prefisso '/ admin'. Ad esempio se utilizzi Grappelli per l'interfaccia di amministrazione, la tua finestra di amministrazione di m2m o di ricerca automatica completa di admin andrà a "site.url/grappelli/lookup". Quindi dovresti gestirlo anche nel metodo cookie_name dall'esempio sopra perché per la ricerca si otterrebbe una risposta proibita 403 in quel caso. – pawelmech

+0

v'è anche un problema con token CSRF, forme su entrambi i admin e sito non amministratore lo userà e sovrascrivere, quindi il nome del cookie CSRF dovrebbe anche essere variata tra amministratore e il sito non admin. – pawelmech

+0

Bella soluzione per alcuni ambienti di sviluppo. A proposito, penso che inhreit di SessionMiddleware sia migliore. – Kixoms