2010-08-28 16 views
15

¿Cuál es la mejor manera de manejar el estilo personalizado por el usuario? Sólo como ejemplo del resultado que estoy buscando, esto sería suficiente:Generación de CSS dinámico

body { 
    color: {{ user.profile.text_color }}; 
} 

Sin embargo, sirviendo CSS como una vista parece que sería causar una cantidad significativa de los gastos generales en un archivo que se solicita constantemente, por lo esta probablemente no es una buena solución.

El usuario no tiene acceso a los archivos CSS y debemos suponer que no tienen conocimiento de desarrollo web.

Respuesta

15

Sin embargo, el servicio de CSS como una vista parece que causaría una gran cantidad de sobrecarga en un archivo que se solicita constantemente, por lo que probablemente esta no sea una buena solución.

¿Y si generarías ese CSS una vez?

  1. CSS por defecto es: /common/css.css
  2. miembro personalizar CSS, ahora <link /> puntos Elementos de /user-specific/123.css?ts=123123123. 123 es, por supuesto, un identificador del miembro, y ts parámetro contiene una marca de tiempo - una fecha de la última modificación CSS
  3. Asegúrese de que el generador de CSS establece cabeceras HTTP apropiadas responsables de la caché del cliente
  4. petición del navegador del usuario CSS archivo - servidor responde con una simple cabecera 304 Not Modified - no hay necesidad de ninguna ejecución del script o contenidos descargar
  5. Cuando el miembro modifica su CSS, solo tienes que actualizar ts - una vez más, se necesita sólo una única solicitud
+0

+1 tiene sentido para mí. –

5

Realice el CSS de forma dinámica a través de una vista como de costumbre, pero use caching agresivo para que se cargue rápidamente.

+0

+1 para KISS .... –

+1

Esta solución es un poco simplista. El CSS está * * por usuario * y almacenar en caché correctamente significa que hay un elemento de caché diferente para cada configuración posible. Una alternativa es almacenar en caché el 98% de la página, pero use un envoltorio externo dinámico '

... whatever ...
' que use la configuración por usuario. Alternativamente, puede usar JavaScript para ajustar la clase externa, pero eso puede no ser aceptable en esta situación. –

0

puede tratar django mediagenerato, de hecho, leí esta Q y estaba buscando una solución como tú, entonces encontré que Django-mediagenerator

No lo intenté todavía, pero parece ser una solución.

Cuestiones relacionadas