2010-06-17 8 views
10

Estoy escribiendo un sitio web basado en Django que permite a los usuarios seleccionar un esquema de color a través de una interfaz de administración.¿Cómo crear un CSS personalizado "sobre la marcha" según la configuración de la cuenta en un sitio de Django?

Ya tengo procesadores de middleware/contexto que vinculan la solicitud actual (basada en el dominio) a la cuenta.

Mi pregunta es cómo servir dinámicamente el CSS con el esquema de color personalizado de la cuenta.

veo dos opciones:

  1. añadir un bloque de CSS a la plantilla base que anula los estilos w/variables pasadas a través de un procesador de contexto.

  2. Utilice una URL personalizada (por ejemplo, "/ static/dynamic/css/< id_sitio web//styles.css") que se enruta a una vista que toma todos los valores necesarios y crea el archivo css.

me conformo con cualquiera de las opciones, pero me preguntaba si alguien más por ahí se ha ocupado de problemas similares y podría dar alguna idea de "Buenas Prácticas".

Actualización: Me inclino por la opción número 2, ya que creo que esto permitirá un mejor almacenamiento en caché en el camino. Por lo tanto, es dinámico la primera vez, se almacena en Memcache (o lo que sea) y se invalida cuando un usuario actualiza su configuración en el sitio de administración.

Actualización: En primer lugar, me gustaría agradecer a todos por sus sugerencias hasta el momento. Todas las respuestas hasta ahora se han centrado en la generación de archivos estáticos. Aunque esto funcionaría muy bien en la producción, se siente como una gran carga durante el desarrollo. Si quisiera agregar un nuevo elemento para ser peinado, o modificar los estilos existentes, tendría que pasar y volver a crear cada uno de los archivos css. Claro, esto podría hacerse con un comando de administración, pero simplemente no siento que valga la pena. Hacerlo de manera dinámica agregaría 1 tal vez 2 consultas a cada carga de página, lo cual es algo que no me preocupa en esta etapa. Todo lo que necesito saber es que en algún momento podré guardarlo en caché sin volver a escribir todo el asunto.

+1

¿necesita estar sobre la marcha? la personalización podría producir un archivo .css que se almacena por usuario, y las páginas podrían apuntar a ese archivo .css – drfrogsplat

+1

@drfrogsplat: Gracias por el comentario. El problema con este enfoque en mi situación es si tuviera que agregar un nuevo estilo que tendría que pasar, eliminar y volver a crear cada archivo CSS. – sdolan

Respuesta

2

He utilizado la opción # 2 con éxito. Hay 2 formas dignas de la actualización de los archivos estáticos generados, que yo sepa:

  1. Uso una versión querystring como /special_path.css?v=11452354234 donde se genera el parámetro v de un campo de base de datos, clave en memcached , o algún otro archivo persistente. La versión se actualiza por el administrador, o para el desarrollo simplemente harías que la generación no se guarde si el parámetro fuera algo especial como v = -1. Necesitarás un proceso para limpiar las viejas generaciones después de un tiempo.

  2. No utilice una cadena de consulta de versión, pero haga que busque primero el archivo generado, si no puede encontrarlo, lo genera. Puede crear un trabajo cron o una aplicación WSGI que busque cambios en el sistema de archivos para el desarrollo, y un gancho desde su panel de administración que elimine las generaciones posteriores a una actualización. Aquí hay un ejemplo del monitoreo, que debería convertir para ser específico para sus generaciones y no para Django. http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring%5FFor%5FCode%5FChanges

+0

Por cierto, no recomiendo tener el monitor ejecutándose en una aplicación de producción, solo para ser claro. Eso sería un asesino de rendimiento. – Jordan

+0

Gracias, voy a ir con # 1 con algunos de los consejos mencionados por otros. – sdolan

+0

Por cierto, este método se presta muy bien a un mecanismo de reemplazo variable, ya que de todos modos se procesará el .css con Python. Si no es solo CSS de forma libre, y tiene una lista de propiedades conocida, puede pasarlas a un archivo css de plantilla que reemplaza dinámicamente con todo lo que hay en la base de datos. ¡Buena suerte! – Jordan

1

Buena pregunta.

Sugeriría pregenerar el archivo css después de guardar el esquema de colores. Esto tendría un impacto positivo en el almacenamiento en caché y el tiempo de carga de la página en general. Puede almacenar sus archivos en el directorio css /media/css/custom/<id or stometing>/styles.css o /media/css/custom/<id or sth>.css y en la plantilla añadir <link rel="stylesheet" href="/media/css/custom/{{some_var_pointing _to_file_name}}" />

También se puede hacer el truco con un poco de de números aleatorios o la fecha en nombre del archivo CSS que podría ser cambiado cada archivo se guarda el tiempo. Gracias a este navegador se cargará el archivo de inmediato en caso de cambios.

ACTUALIZACIÓN: ejemplo de utilización de modelo para mejorar este ejemplo para hacer la gestión de los archivos fácilmente puede crear modelo simple (uno por usuario):

class UserCSS(models.Model): 
    bg_color = models.CharField(..) 
    ... 
    ... 

campos (como bg_color) puede representar partes de su archivo css. Puede reemplazar el método save para agregar lógica que crea un archivo css para el usuario (mediante la representación de alguna plantilla).

En caso de que cambie su formato de archivo, puede realizar cambios en la definición del modelo (con algunos valores predeterminados para campos nuevos), realizar pequeños cambios en la plantilla y ejecutar el método guardar para cada instancia de clase existente. Esto renovaría tus archivos css.

Eso debería funcionar muy bien.

1

Podría generar el CSS y almacenarlo en un campo de texto en el mismo modelo que el perfil de usuario/configuración. Podría entonces tener una vista para recrearlos si cambia un estilo. Luego haz tu opción 1 arriba.

1

Crearía una clave md5 con los elementos del tema, almacenaría esta clave en el perfil de usuario y crearía un archivo ccs con el nombre de esta clave md5: obtendrá acceso a archivos estáticos y detección automática de cambios de tema.

Cuestiones relacionadas