Django подсчет количества просмотров

6442 0

Вот и закончились наконец выборы. Кто-то начал собирать вещички на ПМЖ, кто-то вспомнил про работу. Мне же события последних дней напомнили как я организовывал на сайте свои "маленькие выборы" - рейтинг самых читаемых статей.

Как и все организаторы выборов моей заботой стало качество подсчетов и неминуемость записи результатов. В итоге я отмел все сторонние предложения и решил заморочаться сам.

Что из этого вышло видно на сайте. Количество просмотров считается относительно точно, рейтинг статей по количеству прочтений опирается на количество просмотров.


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


Итак пишем лог просмотров.
Для этого в 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()"

В результате при запросе из базы с обратной сортировкой по полю счетчика показов мы можем получить самые просматриваемые/популярные статьи.

 

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

Наверное поэтому я вспомнил про выборы :)

 

Комментарии

Контактные данные

 Россия, г. Москва