¿Django 1.6 OrderedDict retiene el estado en todas las solicitudes? o caché habilitado por defecto?

Estoy usando django 1.6.0. Estoy trabajando en una aplicación web con un cliente “panel”. En el panel del cliente hay tabs en el encabezado de la plantilla base. Las tabs son dinámicas y cambian según el rol / permisos del usuario que ve el tablero.

Todas las vistas se escriben utilizando vistas basadas en clase. Todas las vistas del cuadro de mandos se heredan de una vista de mezcla principal que garantiza que el usuario que ha iniciado sesión tenga permiso para ver los objetos que solicitó ver y que construye las tabs del cuadro de control en función de su función de usuario.

class ParentMixin(object): pages = OrderedDict([ ('General': { 'link': build_a_link_for_the_logged_in_user()}), ]) def dispatch(self, *args, **kwargs): # validate that logged in user has permission to view requested objects if user_passes_test(self.request.user): self.object = get_users_object_to_view(self.request.user) def get_context_data(self, **kwargs): if self.request.is_superuser and self.object.is_demo: self.pages['Superuser'] = {'link': build_link()} context = super(parent_get_context_data) context['pages'] = self.pages 

Luego, en la plantilla base de la que se heredan todas las vistas del panel, se muestran las tabs / enlaces dynamics:

  {% for page_name, page_data in pages.items %} {% if page_data.is_current %}  {% else %}  {% endif %} {{ page_name }}  {% endfor %} 

Mi pregunta:

Esta mañana, noté que si había solicitado un objeto de demostración, luego hice clic en un enlace para ver un panel de objetos diferente, ¡¡los últimos objetos Superuser Link aún aparecerían en el diccionario de páginas !! Puse en declaraciones de depuración en la vista. La vista reconocería que yo era un superusuario y el object.is_demo era False. Por lo tanto, el condicional no agregaría el enlace de self.pages a las self.pages . Pero el enlace de self.pages todavía estaba en las self.pages y tenía el enlace del último objeto que vi. Este es el único lugar en el que se establecieron self.pages['Superuser'] .

¿Alguien sabe cómo estos datos pueden persistir entre las solicitudes? ¿O podría ver algo mal con mi enfoque? self.pages el error esta mañana eliminando el self.pages de self.pages antes de realizar la comprobación condicional para ver si un superusuario estaba haciendo la solicitud y el objeto era una demostración:

 if 'Superuser' in self.pages: del(self.pages['Superuser']) 

Gracias,

Related of "¿Django 1.6 OrderedDict retiene el estado en todas las solicitudes? o caché habilitado por defecto?"

Esto está haciendo exactamente lo que le dices. Ha establecido que las pages sean un atributo de clase de ParentMixin, lo que significa que también será un atributo de clase de cualquier clase de vista en la que lo mezcle. Los atributos de clase se comparten en todas las instancias de la clase dentro de un proceso y, como un proceso dura en muchas solicitudes, los datos persistirán en esas solicitudes.

Siempre debe establecer atributos en self , lo que significa hacerlo dentro de un método, en este caso probablemente dentro de get_context_data . Django hace todo lo posible para garantizar que los datos de instancia no se compartan en vistas basadas en clases, pero esto no se aplica a los datos de nivel de clase.