Django - Предварительный сигнал? - PullRequest
1 голос
/ 07 апреля 2011

У меня есть приложение «живые настройки», которое я использую для хранения определенных глобальных настроек сайта. Некоторые страницы моего сайта ссылаются на эти настройки, хотя обычно они используют только 2-3 одновременно. Я получаю доступ к этим настройкам, используя собственный тег шаблона, например:

{% settings site_name %}

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

{% settings site_name %} {% settings num_articles %} 

база данных будет запрашиваться дважды.

То, что я хотел бы сделать, это не нажимать на базу данных более одного раза на страницу для значений параметров, если бы я мог получить все параметры, использованные на странице, а затем нажать на базу данных, чтобы получить их все, это было бы много лучше.

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

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

Согласитесь с Дэниелом, что process_template_response - это тот крюк, который вы ищете. Я не знаю, сколько у вас настроек, но также может иметь смысл восстановить все настройки один раз и сохранить их в некоторой словарной структуре, чтобы вы могли получить к ним доступ в любое время, не обращаясь к базе данных. Вы можете получить их один раз либо по запросу, либо - даже если ваши настройки практически не изменяются - при инициализации django. Вы можете дополнительно использовать сигналы django для обновления ваших кэшированных настроек при удалении или обновлении.

Если вы посмотрите на django-dbsettings , вы увидите, что он делает то же самое!

1 голос
/ 07 апреля 2011

Django 1.3 включает в себя новый класс TemplateResponse, который позволяет изменять ответ позже в процессе рендеринга - например, в middleware . Похоже, он может делать то, что вы хотите.

0 голосов
/ 07 апреля 2011

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

Пример фильтра:

def get_settings(key_list):
    # take values from conf.settings. In practice, can be from any source
    return dict((k, getattr(settings, k, None)) for k in key_list.split(","))
register.filter("get_settings", get_settings)

Использование:

{# load multiple values with a single call #}
{% with "KEY1,KEY2"|get_settings as settings %}
     setting values {{ settings.KEY1 }} and {{ settings.KEY2 }}
{% endwith %}

Обратите внимание, что я использовал фильтр вместо тега, потому что встроенная функция with ожидает одно значение до as.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...