¿Hay alguna forma de acceder al contexto desde cualquier lugar en Django?

Estoy buscando una manera de tener una variable global a la que pueda acceder cualquier módulo dentro de mi solicitud de django sin tener que pasarla como parámetro. Tradicionalmente, en otros MVC, lo almacenaba en el contexto o sesión de solicitud y accedía al contexto con algo como un método “get_current_context” (que no pude encontrar en Django).

¿Hay algo como esto, o algún otro mecanismo que me permita tener un valor disponible desde cualquier lugar en el contexto de la solicitud?

TIA!

ACTUALIZACIÓN: Mi investigación solo ha encontrado una solución viable: los locales de subprocesos (algunos dirían que no es viable, pero hay una discusión muy activa al respecto, con ventajas y desventajas y parece que la mayoría de las personas piensan que debería poder usarla) Django, si lo haces responsablemente).

Aún no está completamente claro para mí lo que está intentando lograr, pero parece que tal vez quiera algo como lo siguiente.

Si creas una pieza de middleware en, di …

 myproject/myapp/middleware/globalrequestmiddleware.py 

… que se parece a esto …

 import thread class GlobalRequestMiddleware(object): _threadmap = {} @classmethod def get_current_request(cls): return cls._threadmap[thread.get_ident()] def process_request(self, request): self._threadmap[thread.get_ident()] = request def process_exception(self, request, exception): try: del self._threadmap[thread.get_ident()] except KeyError: pass def process_response(self, request, response): try: del self._threadmap[thread.get_ident()] except KeyError: pass return response 

… luego MIDDLEWARE_CLASSES a tu settings.py MIDDLEWARE_CLASSES como el primer elemento de la lista …

 MIDDLEWARE_CLASSES = ( 'myproject.myapp.middleware.globalrequestmiddleware.GlobalRequestMiddleware', # ... ) 

… entonces puede usarlo en cualquier parte del proceso de solicitud / respuesta como este …

 from myproject.myapp.middleware.globalrequestmiddleware import GlobalRequestMiddleware # Get the current request object for this thread request = GlobalRequestMiddleware.get_current_request() # Access some of its attributes print 'The current value of session variable "foo" is "%s"' % request.SESSION['foo'] print 'The current user is "%s"' % request.user.username # Add something to it, which we can use later on request.some_new_attr = 'some_new_value' 

… o lo que sea que quieras hacer.

Tienes que escribir tu propio ContextProcessor, como se explica aquí .


EDITAR:

Después de haber creado un procesador de contexto, por ejemplo,

 def ip_address_processor(request): return {'ip_address': request.META['REMOTE_ADDR']} 

puede obtener las variables que necesita al inicializar un RequestContext, como este:

 from django.template import RequestContext def myview(request): rc = RequestContext(request) rc.get('ip_address') 

Sin embargo, tenga en cuenta que si no coloca su procesador de contexto dentro de la tupla TEMPLATE_CONTEXT_PROCESSORS, debe pasar el procesador a RequestContext como un argumento, por ejemplo:

 from django.template import RequestContext def ip_address_processor(request): return {'ip_address': request.META['REMOTE_ADDR']} def myview(request): rc = RequestContext(request, processors=[ip_address_processor]) rc.get('ip_address') 

Algunos enlaces útiles:

  • Documentación API Django Template
  • Configuraciones TEMPLATE_CONTEXT_PROCESSORS
  • Libro Django: Plantillas Avanzadas

Todavía puede acceder a la sesión actual prácticamente en cualquier lugar.

Utilizar:

 from django.contrib.sessions.backends.db import SessionStore ... s = SessionStore() s.session_key # unique_id s['myvar'] = "something" s.save() 

Esto, por supuesto, utiliza la base de datos y la tabla de sesiones, por lo que puede ser un poco excesivo. ¿Es la variable específica de sesión, o es solo un costo global?

Docs: https://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-out-of-views

PS Lo que he hecho en el pasado es crear mi propia tabla con una columna session_id y varias otras cosas, luego hacer el SQL para seleccionar datos basados ​​en session_id manualmente. Mucho más rápido que usar el azúcar SessionStore ()