문제

나는 새롭고 혼란 스러워요. 기사와 블로그 모델의 "Top Hit"인스턴스를 추적하는 모듈을 만들고 싶습니다. 기사 나 블로그 모델의 코드를 터치하고 싶지 않습니다. 이것이 미들웨어 후보입니까? 보고 HttpRequest.path?

도움이 되었습니까?

해결책

Middleware request.path를 보는 Middleware는 기사 및 블로그 게시물을 표시하는 데 사용하는 URL 패턴의 세부 사항에 대한 종속성을 소개하므로 추악합니다. 이 커플 링을 신경 쓰지 않으면 성능을 저장하고 웹 서버 로그 파일에 대한 분석을 수행 할 수도 있습니다. (편집하다: 미들웨어를 봅니다 호출 가능과 args를 제공하기 때문에 더 나은 옵션이 될 것입니다. 관련없는 뷰에서 오버 헤드가 발생하지 않기 때문에 데코레이터 접근 방식을 선호하지만 블로그/기사 응용 프로그램의 URLConf를 터치하지 않으려면 미들웨어보기가 작동합니다).

나는 당신이 Object_Detail보기 (또는 사용자 정의 동등한) 주위를 감싸는 View Decorator를 사용합니다. 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(...

또는 UrlConf에서 :

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

다른 팁

일반적인 히트 모델을 만들 수 있습니다

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')

당신의 견해에서 당신은이 기능을 작성합니다.

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 등으로 히트 하이스토리를 필터링하는 힘을 제공합니다.

히트 테이블이 빠르게 증가 할 수 있으므로 삭제 전략에 대해 생각해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top