Как создать пользовательский CSS “на лету” на основе настроек учетной записи в сайте Django?

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

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

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

Я вижу две опции:

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

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

Я доволен любой опцией, но задавался вопросом, имел ли кто-либо еще там дело с подобными проблемами и мог бы дать некоторое понимание относительно "Лучших практик".

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

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

10
задан Sam Dolan 17 June 2010 в 16:24
поделиться

4 ответа

Я успешно использовал вариант №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

3
ответ дан 4 December 2019 в 03:15
поделиться

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

1
ответ дан 4 December 2019 в 03:15
поделиться

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

Я бы предложил предварительно генерировать css файл после сохранения цветовой схемы. Это положительно скажется на кэшировании и общем времени загрузки страницы. Вы можете хранить ваши css файлы в директории /media/css/custom//styles.css или /media/css/custom/.css и в шаблоне добавить

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

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

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

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

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

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

1
ответ дан 4 December 2019 в 03:15
поделиться

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

1
ответ дан 4 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: