2009-10-21 1 views
26

나는 누군가가 이것을 근사하는 플러그 가능한 응용 프로그램 (또는 지침서)을 가지고있을 것이라고 확신하지만 그것을 발견하는 데 어려움이 있습니다. 특정 객체에있는 "보기"의 ​​수를 추적 할 수 있기를 원합니다. stackoverflow에 대한 질문은 "view count"를 가짐).개체의 "페이지 뷰"또는 "히트 수"를 추적 하시겠습니까?

사용자가 로그인하지 않은 경우 실수로 페이지를 새로 고침하여 조회수를 올릴 수 없도록 쿠키를 배치하거나 IP를 기록하려고해도 괜찮습니다. 사용자가 로그인 한 경우 세션/브라우저/IP 주소에서 하나의 "보기"만 허용합니다. 나는 그것보다 더 좋아할 필요가 없다고 생각한다.

내가 할 수있는 최선의 방법을 그림이 내가 추적 할 다양한 모델에서 분리하고 (종류의)는 F 식을 사용하는 미들웨어 함께 - stackoverlow에 다른 질문이 ( 1)에 언급 한 ( 2) ( 3).

하지만이 코드가 이미 야생에 존재하는지 궁금합니다. 왜냐하면 나는 현명한 코더가 아니기 때문에 누군가가 잘 할 수있을 것이라고 확신합니다. 미소.

본 적이 있습니까? 나는 이미 어떤 관심을 제기 didnt한다 언급 된 질문 중 하나를 답으로 쓴 내 생각을 재 게시

답변

37

내 자신의 질문에 답하는 것이 가장 좋을지 모르겠지만, 약간의 작업을 거쳐 본질적으로 문제를 해결하는 앱을 작성했습니다 : django-hitcount.

the documentation page에서 사용 방법을 읽을 수 있습니다.

django-hitcount에 대한 아이디어는 내 두 가지 원래 답변 (Teebes- 및 vikingosegundo) 모두에서 나왔는데, 실제로이 모든 것을 생각하기 시작했습니다.

이것은 커뮤니티와 플러그인 가능한 앱을 공유하려는 나의 첫 시도이며 다른 누군가가 유용하다고 생각하기를 바랍니다. 감사!

+0

니스, 나는 그것을 조사 할 것이다! – vikingosegundo

+5

히트 카운트가이 작업에 비해 복잡해 보입니다. 특히 히트 카운트에 대한 모델을 사용하면 실제로 무거울 수 있습니다. 대신 캐시를 사용하는 것이 좋습니다 (프로젝트에서했던 것처럼). 스마트 캐시 이름 + 타임 아웃은 문제를 잘 처리하며 매우 빠릅니다. – thedk

+0

위대한 앱입니다. 감사합니다. 검색 엔진의 조회수가 자동으로 제외됩니까? –

8

, : D

당신은 일반적인 히트 모델

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

의를 만들 수 있습니다 당신의 view.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, 
     }) 

이 방법은 당신에게 힘의 히트를 계산 할 수 있지만, 그래서 시간의 contentType에 의해 히트 역사를 필터링 할뿐만 아니라 ... 히트 테이블로

를 제공 빠르게 성장 될 수있다, 삭제 전략에 대해 생각해야합니다.

+0

네 - 난 당신의 코드를 볼 않았고, 내 관심을 높이기 않았다! 미소. 그러나, 내가 가져 와서 사용할 수있는 앱에 이미 뭔가가 있기를 바랬지 만 히트 모델 (및 일반적인 측면)을 @Teebes의 세션 제안과 결합하려고 시도 할 수 있습니다. 감사. – thornomad

+0

물론, 그들을 결합해야합니다. 세션을 통해 단일 사용자에 대한 정보를 얻을 수 있습니다. 내 접근 방식으로 동일한 코드를 반복해서 쓰지 않고도 뷰를 제어 할 수 있습니다. 해결책으로 가져 가라. – vikingosegundo

+0

Typo : DateTimeFiles는 DateTimeField로 읽어야합니다. 그렇지 않습니까? – Meilo

20

검증되지 않은 코드 당신은 장고를 사용해야합니다 내장 된 세션 프레임 워크, 이미 당신을 위해이 많이 않습니다. views.py에서

class QuestionView(models.Model): 
    question = models.ForeignKey(Question, related_name='questionviews') 
    ip = models.CharField(max_length=40) 
    session = models.CharField(max_length=40) 
    created = models.DateTimeField(default=datetime.datetime.now()) 

:

models.py에

:

def record_view(request, question_id): 

    question = get_object_or_404(Question, pk=question_id) 

    if not QuestionView.objects.filter(
        question=question, 
        session=request.session.session_key): 
     view = QuestionView(question=question, 
          ip=request.META['REMOTE_ADDR'], 
          created=datetime.datetime.now(), 
          session=request.session.session_key) 
     view.save() 

    return HttpResponse(u"%s" % QuestionView.objects.filter(question=question).count()) 

Vikingosegundo가 나는 Q & 내가보기를 추적하고 싶었 A 앱으로 다음과 같은 방법으로이를 구현 아마 바로 콘텐츠 유형을 사용하는 것이 더 재사용 가능한 솔루션 일지 모르지만 추적 세션과 관련하여 확실히 재발견하지 마십시오. 장고는 이미 그렇게했습니다!

마지막으로 조회수가 Ajax 또는 CSS 링크를 통해 호출되어 검색 엔진이 카운트를 갱신하지 못하게하는보기가 있어야합니다.

희망 하시겠습니까?

+0

그게 도움이 - 어떻게 세션 정보를 사용하고 모든 것이 유용 할거야. 나는 vikingosegundo의 접근 방식도 좋아한다. 다른 것을 찾을 수 없다면 둘을 결합 할 수 있습니다. 그리고, 수색 엔진을 명심해야 할 것이다 - 나는 그것을 생각하지 않았다. 그러나 그들은 확인 될 수있는 특정 헤더를 포함 할 것입니다 ... 안돼요? – thornomad

+0

헤더를 확실히 확인할 수 있습니다. 이 이전 질문 http://stackoverflow.com/questions/45824/counting-number-of-views-for-a-page-ignoring-search-engines이 (장고 아닌 특정) 아주 좋은 정보가 있습니다. – Teebes

0

쿠키를 사용하여 만들었습니다. 그렇게하는 것이 좋은지 아닌지 모르겠다. 다음 코드는 이미 설정된 쿠키를 먼저 찾습니다. 존재하지 않으면 total_view 카운터를 증가 시키며, total_view 및 unique_views를 모두 증가시킵니다. total_views와 unique_views는 Django 모델의 필드입니다.

def view(request): 
    ... 
    cookie_state = request.COOKIES.get('viewed_post_%s' % post_name_slug) 
    response = render_to_response('community/post.html',context_instance=RequestContext(request, context_dict)) 
    if cookie_state: 
     Post.objects.filter(id=post.id).update(total_views=F('total_views') + 1) 
    else: 
     Post.objects.filter(id=post.id).update(unique_views=F('unique_views') + 1) 
     Post.objects.filter(id=post.id).update(total_views=F('total_views') + 1) 
         response.set_cookie('viewed_post_%s' % post_name_slug , True, max_age=2678400) 
    return response 
0

모델 페이지 뷰를 만들고 그 안에 "조회수"를 만들어서 만들었습니다. 홈페이지 URL에 도달 할 때마다. 나는 열 히트의 첫 번째 행과 유일한 행을 증가시키고 그것을 템플리트에 렌더링합니다. 여기 보이는 방법.

Views.py

def Home(request): 

    if(PageView.objects.count()<=0): 
     x=PageView.objects.create() 
     x.save() 
    else: 
     x=PageView.objects.all()[0] 
     x.hits=x.hits+1 
     x.save() 
    context={'page':x.hits} 
    return render(request,'home.html',context=context) 

Models.py

class PageView(models.Model): 
    hits=models.IntegerField(default=0) 
관련 문제