Запросы к базе данных и быстрый ответ - PullRequest
1 голос
/ 23 января 2012

Мы делаем компонент геймификации для нашего форума, который разрабатывается в Джанго.Мы бы хотели, чтобы пользователи получали значки сразу после достижения определенных целей.Тем не менее, мы обеспокоены количеством запросов к базе данных, которые будут сделаны.Например, возьмите значок, который дается, если сообщение получает определенное количество просмотров.Если условие для значка проверяется каждый раз при просмотре сообщения, это будет много запросов.Является ли наша единственная другая опция для проверки через определенные промежутки времени или другого события, например, пользователь просматривает свой профиль?Это было бы менее оптимально с точки зрения пользователя из-за задержки.

1 Ответ

0 голосов
/ 23 января 2012

Существует другой подход, который может вам подойти, используя ведение журнала веб-сервера и постобработку, которые регистрируют для создания статистики. Я использовал его в Apache с некоторыми проектами, для которых требовалось количество просмотров страниц. Аналогичная конфигурация для других веб-серверов будет работать так же.

Я использую django.contrib.contentypes , чтобы записать Идентификатор типа содержимого и Идентификатор объекта для объекта, к которому осуществляется доступ в этом примере, но вы, конечно, можете регистрировать все, что захотите.

Итак, в вашем файле Apache virtualhost conf добавьте директиву LogFormat, например:

LogFormat "%{X-H-CID}o|%{X-H-OID}o" hitcounter

И затем присоединение его к CustomLog:

CustomLog path/to/your/logfile.log hitcounter

Это позволит Apache записать в файл журнала следующие заголовки HTTP: X-H-CID и X-H-OID, которые представляют идентификаторы ContentType и Object ID объекта, к которому обращаются. Из представления вы можете добавить заголовки к HttpResponse:

ctxt = RequestContext(request) 
rendered = render_to_string(template, ctxt)
http_res = HttpResponse(rendered) 
http_res['X-H-CID'] = content_type_id
http_res['X-H-OID'] = object_id

Замените content_type_id и object_id вашими реквизитами реальных объектов.

В этом примере следует написать строку вроде:

16|4353

, где 16 - идентификатор типа контента, а 4353 - идентификатор объекта. Наконец, вы можете запланировать пользовательскую команду django для обработки этого файла журнала и выполнения необходимых действий.

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