Как создать собственный CSS «на лету» на основе настроек аккаунта на сайте Django? - PullRequest
10 голосов
/ 17 июня 2010

Итак, я пишу веб-сайт на основе Django, который позволяет пользователям выбирать цветовую схему через интерфейс администрирования.

У меня уже есть промежуточное программное обеспечение / контекстные процессоры, которые связывают текущий запрос (на основе домена) с учетной записью.

Мой вопрос заключается в том, как динамически обслуживать CSS с помощью пользовательской цветовой схемы учетной записи.

Я вижу два варианта:

  1. Добавить блок CSS в базовый шаблон, который переопределяет стили с переменными, передаваемыми через процессоры контекста.

  2. Используйте пользовательский URL (например, "/ static / dynamic / css / /styles.css"), который перенаправляется в представление, которое собирает все необходимые значения и создает файл css.

Я согласен с любым вариантом, но мне было интересно, сталкивался ли кто-нибудь еще с подобными проблемами и мог бы дать некоторое представление о «передовой практике».

Обновление : Я склоняюсь к варианту № 2, так как думаю, что это позволит улучшить кэширование в будущем.Таким образом, он динамический в первый раз, сохраняется в memcache (или где-либо еще) и становится недействительным, когда пользователь обновляет свои настройки на сайте администратора.

Обновление : Во-первых, я хотел быспасибо всем за их предложения до сих пор.Все ответы до сих пор были сосредоточены вокруг создания статических файлов.Хотя это отлично работает на производстве, во время разработки это кажется огромным бременем.Если бы я хотел добавить новый элемент для стилизации или настроить существующие стили, мне пришлось бы пройтись и воссоздать каждый файл CSS.Конечно, это можно сделать с помощью команды управления, но я просто не чувствую, что это того стоит.Выполнение этого динамически добавило бы 1, возможно, 2 запроса к каждой загрузке страницы, и на этом этапе я не беспокоюсь.Все, что мне нужно знать, это то, что в какой-то момент я смогу кешировать его, не переписывая все это.

Ответы [ 4 ]

2 голосов
/ 17 июня 2010

Я успешно использовал вариант № 2.Мне известны 2 достойных способа обновления сгенерированных статических файлов:

  1. Используйте строку запроса версии, например /special_path.css?v=11452354234, где параметр v генерируется из базы данных.поле, введите memcached или другой постоянный файл.Версия обновляется администратором, или для разработки вы бы просто не сохранили генерацию, если бы параметр был чем-то особенным, например, v = -1.Через некоторое время вам понадобится процесс для очистки старых поколений.

  2. Не используйте строку запроса версии, но сначала посмотрите, сгенерирован ли файл, если он может 'не найти его, он генерирует это.Вы можете создать задание cron или приложение WSGI, которое ищет изменения файловой системы для разработки, и получить хук из панели администратора, который удаляет поколения после обновления.Вот пример мониторинга, который вы должны будете преобразовать, чтобы он соответствовал вашим поколениям, а не Django.http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring%5FFor%5FCode%5FChanges

1 голос
/ 17 июня 2010

Может сгенерировать CSS и сохранить его в текстовом поле в той же модели, что и профиль пользователя / настройки.После этого можно изменить их, если вы измените стиль.Тогда сделайте свой вариант 1 выше.

1 голос
/ 17 июня 2010

Я хотел бы создать ключ md5 с элементами темы, сохранить этот ключ в профиле пользователя и создать файл ccs, названный в честь этого ключа md5: вы получаете статический доступ к файлу и автоматическое обнаружение изменения темы.

1 голос
/ 17 июня 2010

Хороший вопрос.

Я бы предложил предварительно сгенерировать файл css после сохранения цветовой схемы.Это положительно скажется на кешировании и общем времени загрузки страницы.Вы можете хранить ваши CSS-файлы в каталоге /media/css/custom/<id or stometing>/styles.css или /media/css/custom/<id or sth>.css и в шаблоне add <link rel="stylesheet" href="/media/css/custom/{{some_var_pointing _to_file_name}}" />

. Вы также можете выполнить трюк с некоторым случайным числом или датой в имени файла CSS * это можно изменить при каждом сохранении файла.Благодаря этому браузер немедленно загрузит файл в случае изменений.

ОБНОВЛЕНИЕ: пример использования модели для улучшения этого примера Чтобы упростить управление этим файлом, вы можете создать простую модель (по одному на пользователя):

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

Поля (например, bg_color) могут представлять части вашего файла CSS.Вы можете ovveride save метод, чтобы добавить логику, которая создает файл CSS для пользователя (путем рендеринга некоторого шаблона).

В случае изменения формата вашего файла вы можете внести изменения в определение модели вашего (с некоторыми значениями по умолчанию для новогополя), внесите небольшие изменения в шаблон и запустите метод сохранения для каждого существующего экземпляра класса.Это обновит ваши CSS-файлы.

Это должно хорошо работать.

...