Django Page Hit Counter Concurrency - PullRequest
       27

Django Page Hit Counter Concurrency

2 голосов
/ 29 августа 2011

Я новичок в Джанго.Я делаю грубый счетчик посещений в качестве задания для курса по веб-программированию в Uni.Я сделал класс HitCount:

from django.db import models

# Create your models here.

class HitCount(models.Model):
    count = models.IntegerField()

И затем я использую этот код в файле представлений:

def index(request):

    #try getting a hitcounter, if there is none, create one
    try:
        hc = HitCount.objects.get(pk=1)
    except: 
        hc = HitCount(count=0)
        hc.save()
        pass

    #get a queryset containing our counter
    hc = HitCount.objects.filter(pk=1)
    #increment its count and update it in db
    hc.update(count=F('count')+1)
    #ATM hc is a queryset, so hc.count will just return how many
    #counters are in the queryset (1). So we have to get the
    #actual counter object
    hc = HitCount.objects.get(pk=1)
    #and return its count
    return render_to_response('hitcount/index.html', {'count': hc.count})

Это мой файл index.html:

<p>{{count}}</p>

Кажется, это работает нормально, но мне интересно:

  • Это разумный способ сделать это?Должен ли код для приращения действительно находиться в файле представлений?Или я должен переместить его в метод класса?
  • Безопасен ли этот параллелизм или мне нужно использовать какой-то тип блокировки?Часть задания заключается в обеспечении безопасности параллельного параллелизма.Я использую SQLite, который использует транзакции, поэтому я решил, что все должно быть в порядке, но я могу что-то упустить.

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

Не по теме, но вы должны ловить HitCount.DoesNotExist при попытке / исключении, поскольку вы действительно хотите выполнить код только в том случае, если объект HitCount еще не существует.

Если это возможно, вы можете захотеть взглянуть на что-то вроде Redis (или другое хранилище ключей / значений), чтобы выполнить счетчик посещений.

Redis предоставляет метод с именем INCR , который автоматически увеличивает значение на 1. Это супер быстро и отличное решение для счетчика обращений, подобного этому. Все, что вам нужно сделать, это создать ключ, связанный со страницей, и вы можете увеличить его на +1.

Возможно, имеет смысл использовать класс middleware для отслеживания посещений страниц. Гораздо проще, чем добавить его к каждому представлению. Если вам нужно отобразить этот счетчик на каждой странице, вы можете использовать процессор контекста ( больше информации ), чтобы добавить счетчик посещений страницы в контекст. Так будет меньше повторений кода.

Редактировать

Изначально я упустил, что это было для проекта Uni, так что это может сильно превысить разработку для того, что вам нужно. Однако, если бы вы когда-либо создавали счетчик посещений для производственной среды, я бы порекомендовал это. Вы все еще можете использовать промежуточное программное обеспечение / контекстные процессоры для выполнения подсчетов / поиска обращений в СУХОЙ манере.

2 голосов
/ 29 августа 2011

Блокировка возможна в python с использованием следующего:

lock = Lock()
lock.acquire()
try:
    ... access shared resource
finally:
    lock.release() # release lock, no matter what

Имейте в виду, что метод не безопасен в многосерверной среде.

Вы также можете создать более расширяемыйРешение для ведения журнала, которое отслеживает каждое попадание в виде строки в БД с соответствующей информацией, а затем может рассчитывать / запрашивать даже в определенном диапазоне дат.

0 голосов
/ 29 августа 2011

Вы можете создать новую строку базы данных для каждого попадания и вызвать HitCount.objects.count (), чтобы получить количество.

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