2010-10-05 19 views
9

Me gustaría tener diferentes sesiones para la interfaz de administración de Django y las aplicaciones para poder iniciar sesión como administrador en la interfaz de administrador y como usuario estándar para la aplicación.Diferentes sesiones para administrador y aplicaciones en Django

¿Alguna idea de cómo lograr eso?

P.S. Claro, puedo usar 2 instancias diferentes de navegador web, de alguna otra manera?

+0

suena interesante, ya que también debe darle la oportunidad de ver frontend/backend en diferentes idiomas ... –

+0

Dudo que esto es posible usando django.contrib .auth , Espero que tengas que escribir tu propia solución, que va a ser mucho más trabajo que simplemente usar 2 instancias de navegador diferentes (o usar el modo privado de tu navegador, p. Chrome Incognito: http://www.google.com/support/chrome/bin/answer.py?hl=es&answer=95464). –

+1

No debería ser posible hacer que esto funcione usando diferentes cookies de sesión/claves de sesión para front-end y backend ... Supongo que tendrías que crear tu propio middleware de sesión, que verifica si se trata de una solicitud de administrador o no y maneja dos diferentes cookies ... –

Respuesta

6

La forma en que he resuelto esto en el pasado es tener 2 URL diferentes. www.example.com y admin.example.com. Como las sesiones se almacenan en cookies, y las cookies son específicas del dominio, puede usar ambas al mismo tiempo.

+0

¡Esta es una buena solución que requiere poco hackeo fuera de la configuración 'urls.py' y un subdominio en su archivo de zona DNS! – jathanism

+0

Si esto responde a su pregunta, por favor márquelo como la respuesta, si no lo hizo haga alguna pregunta de seguimiento y lo seguiré. – Wraithan

+0

En producción, es la forma más elegante. – HardQuestions

1

También puede lograr esto con dos (muy ligeramente diferente) Configuración de archivos, cada uno con una sesión diferente nombre clave:

En settings_app.py:

SESSION_COOKIE_NAME = 'mysite_app' 

En settings_admin.py:

SESSION_COOKIE_NAME = 'mysite_admin' 

He encontrado que es útil tener diferentes archivos urls.py también; aunque no es estrictamente necesario, ayuda con la separación de preocupaciones.

3

Solo quería alentar el uso de la solución propuesta por Bernhard Vallant. Tarda 10 minutos en implementarse y probarse. Simplemente tome la implementación de SessionMiddleware y haga que su propia versión reemplace las configuraciones.SESSION_COOKIE_NAME dependiendo de la ruta de la solicitud comienza con admin url o no y reemplace el middleware django.contrib.sessions.middleware.SessionMiddleware con su configuración nueva. 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 

y en settings.py

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

Sin embargo, hay un problema con la solución anterior. No todas las solicitudes a la interfaz de administración están hechas con el prefijo '/ admin'. Por ejemplo, si usa Grappelli para la interfaz de administrador, su administrador dinámico m2m o las búsquedas de autocompletar irán a 'site.url/grappelli/lookup'. Por lo tanto, necesitaría manejar eso también en el método cookie_name del ejemplo anterior, ya que se prohibiría la respuesta 403 en ese caso para las búsquedas. – pawelmech

+0

También hay un problema con el token csrf, los formularios en el sitio administrador y no administrador lo usarán y sobrescribirán, por lo que el nombre de la cookie csrf también se debe variar en el sitio administrador y no administrador. – pawelmech

+0

Buena solución para algunos entornos de desarrollo. Por cierto, creo que inhreit de SessionMiddleware es mejor. – Kixoms

Cuestiones relacionadas