2009-05-20 7 views
0

Я новичок и смущен. Я хочу создать модуль, который отслеживает «лучшие хиты» экземпляров как статьи, так и модели блога. Я не хочу касаться кода для моделей статей или блога. Является ли это кандидатом для промежуточного программного обеспечения? глядя на HttpRequest.path?Django - просмотр экземпляров экземпляров модели (для приложения «верхние записи»)

ответ

1

Среднее ПО, смотрящее на request.path, является уродливым, так как оно вводит зависимость от деталей шаблонов URL, используемых для отображения статей и сообщений в блогах. Если вы не возражаете против этой связи, тогда вы можете просто сохранить удар производительности и провести анализ в файлах журналов веб-сервера. (EDIT: view middleware будет лучшим вариантом, так как он дает вам возможность вызова и его аргументы. Я бы предпочел подход декоратора, поскольку он не наносит лишних накладных расходов на несвязанные виды, но просмотр промежуточного программного обеспечения будет работать, если вы не хотите коснуться URLconf для приложений для блога/статьи).

Я бы использовал декоратор, который вы обертываете вокруг объекта object_detail (или ваш собственный эквивалент). Вы можете сделать эту упаковку непосредственно в URLconf. Что-то вроде этого:

def count_hits(func): 
    def decorated(request, *args, **kwargs): 
     # ... find object and update hit count for it... 
     return func(request, *args, **kwargs) 
    return decorated 

И вы можете применить его в views.py:

@count_hits 
def detail_view(... 

или в привязок:

url(r'^/blog/post...', count_hits(detail_view)) 
0

вы могли бы создать общую модель Hit

class Hit(models.Model): 
    date = models.DateTimeFiles(auto_now=True) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

на ваш взгляд.py вы пишете эту функцию:

def render_to_response_hit_count(request,template_path,keys,response): 
    for key in keys: 
     for i in response[key]: 
      Hit(content_object=i).save() 
    return render_to_response(template_path, response) 

и мнение, что вы заинтересованы в возвращении

return render_to_response_hit_count(request, 'map/list.html',['list',], 
     { 
      'list': l, 
     }) 

Этот подход дает вам возможность не только рассчитывать на удар, но фильтровать хит-историю по времени, ТипСодержимые и так на ...

Поскольку стол-стол может быстро развиваться, вы должны подумать о стратегии удаления.

Код непроверенный