Вот и закончились наконец выборы. Кто-то начал собирать вещички на ПМЖ, кто-то вспомнил про работу. Мне же события последних дней напомнили как я организовывал на сайте свои "маленькие выборы" - рейтинг самых читаемых статей.
Как и все организаторы выборов моей заботой стало качество подсчетов и неминуемость записи результатов. В итоге я отмел все сторонние предложения и решил заморочаться сам.
Что из этого вышло видно на сайте. Количество просмотров считается относительно точно, рейтинг статей по количеству прочтений опирается на количество просмотров.
Для начала я отказался накапливать количество просмотров непосредственно в базу данных. Я почитал похожее обсуждение у Сагалаева и решил последовать его совету, писать свой лог просмотров. Во всяком случае я его так понял.
Итак пишем лог просмотров.
Для этого в views.py нашего приложения добавляем:
#берем значение директории статики из settings
from settings import STATIC_ROOT
...
#Функция вывода текста нашей заметки
def myview(request...)
...
#создаем или открываем существующий файл куда пишем код заметки
DirPostLog = STATIC_ROOT + "post.log"
if os.path.exists(DirPostLog):
PostLog = open(DirPostLog, "a")
else:
PostLog = open(DirPostLog, "w")
PostLog.write(str(post.id) + "\n")
PostLog.close
...
Замечательно. Лог пишется. Дальше нам надо его прочитать и записать данные в базу.
Для этого делаем функцию чтения такого вида:
def PostLogCount():
#переименовываем наш лог, чтобы лог можно было писать пока мы его пишем в базу
os.rename(STATIC_ROOT + "post.log", STATIC_ROOT + "post_.log")
#открываем лог для чтения
PostLog = open(STATIC_ROOT + "post_.log","r")
PostLog = open(STATIC_ROOT + "post_.log","r")
#читаем лог построчно
for linelog in PostLog.readlines():
#открываем запись в базе с id нашей заметки
post = Posts.objects.get(id=linelog)
if post:
#Если заметка с таким id открылась то прибавляем к счетчику просмотров 1
post.viewcount = story.viewcount + 1
#сохраняем нашу запись
post.save()
#Закрываем файл нами прочитанный
PostLog.close
#удаляем за ненадобностью.
os.remove(STATIC_ROOT + "post_.log")
Функция обработки лога готова теперь осталось только запустить ее в планировщик задач cron
Так как наша функция находится в нашем приложении django можно использовать следующий код для обработки таких функций run.py:
import sys
import settings
from django.core.management import setup_environ
setup_environ(settings)
module_name = sys.argv[1]
exec('import %s' % module_name)
exec('%s.%s' % (module_name, ' '.join(sys.argv[2:])))
Функция обработки не моя. Где взял, каюсь не помню. Использую как есть. Спасибо автору.
В результате в cron для обработки лога просмотров каждые 5 минут будет добавлена следующая строка:
*/05 * * * * python /home/myuser/test_project/run.py myapp.views "PostLogCount()"
В результате при запросе из базы с обратной сортировкой по полю счетчика показов мы можем получить самые просматриваемые/популярные статьи.
Кто-то скажет, что счетчик легко накрутить и рейтинг будет нелегитимным, а я отвечу, что это мой счетчик и результаты мне нужны в первую очередь для улучшения сайта.
Наверное поэтому я вспомнил про выборы :)
Комментарии