2009-10-21 34 views
26

Tôi chắc chắn rằng một người nào đó có một ứng dụng có thể cắm (hoặc hướng dẫn) ngoài đó, nhưng tôi gặp khó khăn trong việc tìm kiếm nó: Tôi muốn có thể theo dõi số lượng "khung nhìn" mà một đối tượng cụ thể có (giống như câu hỏi ở đây trên stackoverflow có một "số lượt xem").Theo dõi số lượng "lượt xem trang" hoặc "lần truy cập" của một đối tượng?

Nếu người dùng không đăng nhập, tôi không ngại đặt cookie (hoặc đăng nhập IP) để họ không thể vô tình chạy lượt xem bằng cách làm mới trang; và nếu người dùng đăng nhập, chỉ cho phép họ "xem" qua các phiên/trình duyệt/địa chỉ IP. Tôi không nghĩ rằng tôi cần nó bất kỳ fancier hơn thế.

Tôi tìm cách tốt nhất để làm điều này là với Middleware được tách ra từ các mô hình khác nhau mà tôi muốn theo dõi và sử dụng biểu thức F (loại) - các câu hỏi khác trên stackoverlow đã ám chỉ đến điều này (1) (2)) (3).

Nhưng tôi tự hỏi liệu mã này có tồn tại trong môi trường hoang dã không - bởi vì tôi không phải là người viết mã độc nhất và tôi chắc chắn ai đó có thể làm tốt hơn. Nụ cười.

Bạn đã xem chưa?

Trả lời

37

Tôi không chắc chắn nếu nó có hương vị tốt nhất để trả lời câu hỏi của riêng tôi, nhưng sau một chút công việc, tôi đặt cùng một ứng dụng giải quyết các vấn đề một cách nghiêm túc: django-hitcount.

Bạn có thể đọc về cách sử dụng nó tại the documentation page.

Các ý tưởng cho hit django đến từ cả hai câu trả lời ban đầu của tôi (Teebes -and- vikingosegundo), điều này khiến tôi bắt đầu suy nghĩ về toàn bộ sự việc.

Đây là nỗ lực đầu tiên của tôi khi chia sẻ một ứng dụng có thể cắm được với cộng đồng và hy vọng người khác thấy nó hữu ích. Cảm ơn!

+0

Đẹp, tôi sẽ kiểm tra xem nó ra! – vikingosegundo

+5

Lượt truy cập có vẻ quá phức tạp cho công việc này. Đặc biệt là sử dụng các mô hình để đếm số lượt truy cập có thể thực sự nặng. Tôi muốn giới thiệu (như tôi đã làm trong dự án của tôi) để sử dụng Cache thay thế. Tên bộ nhớ cache thông minh + timeouts đang xử lý vấn đề độc đáo và nó cực kỳ nhanh. – thedk

+0

ứng dụng tuyệt vời, cảm ơn! Liệu nó có tự động lọc các lần truy cập của công cụ tìm kiếm không? –

8

tôi repost ý tưởng của tôi, mà tôi đã viết như một câu trả lời cho một trong những vấn đề được nêu, nơi nó didnt huy động bất kỳ sự chú ý: D

bạn có thể tạo ra một mô hình Hit generic

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

trong view.py của bạn, bạn viết hàm này:

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) 

và quan điểm mà bạn quan tâm đến lợi nhuận

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

Cách tiếp cận này mang đến cho bạn sức mạnh, không chỉ để đếm số hit, nhưng để lọc các hit-lịch sử theo thời gian, contentType và vân vân ...

Khi hit-bảng có thể phát triển nhanh, bạn nên suy nghĩ về một chiến lược xóa.

Mã chưa được kiểm tra

+0

Yea - Tôi đã nhìn thấy mã của bạn, và nó đã gây sự chú ý của tôi! Nụ cười. Tuy nhiên, đã hy vọng một cái gì đó đã có trong một ứng dụng mà tôi chỉ có thể nhập và sau đó sử dụng ... nhưng, tôi có thể thử và kết hợp mô hình Hit của bạn (và các khía cạnh chung) với các đề xuất phiên của @Teebes. Cảm ơn. – thornomad

+0

Chắc chắn, bạn nên kết hợp chúng. với phiên u nhận được thông tin về người dùng duy nhất. và với cách tiếp cận của tôi, u có thể kiểm soát các khung nhìn được kích hoạt mà không cần viết lại mã giống nhau. đưa nó vào dung dịch ur. – vikingosegundo

+0

Typo: DateTimeFiles nên đọc là DateTimeField, phải không? – Meilo

20

Bạn nên sử dụng django tích hợp trong khuôn khổ phiên, nó đã làm rất nhiều việc này cho bạn. Tôi thực hiện điều này theo cách sau với một Q & Một ứng dụng mà tôi muốn theo dõi lượt xem:

trong models.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()) 

trong views.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 là có lẽ ngay cả khi sử dụng kiểu nội dung có lẽ là giải pháp tái sử dụng nhiều hơn nhưng chắc chắn không phát minh lại bánh xe về các phiên theo dõi, Django đã làm điều đó!

Điều cuối cùng, có lẽ bạn nên có chế độ xem ghi lại lần truy cập được gọi qua Ajax hoặc liên kết css để công cụ tìm kiếm không tăng số lượng của bạn.

Hy vọng điều đó sẽ hữu ích!

+0

Điều đó giúp ích - cách bạn sử dụng thông tin phiên và mọi thứ sẽ hữu ích. Tôi cũng thích cách tiếp cận của vikingosegundo - đó là chung chung hơn. Nếu tôi không thể tìm thấy bất cứ điều gì khác, tôi có thể kết hợp cả hai. Và, sẽ phải ghi nhớ các công cụ tìm kiếm - tôi đã không nghĩ về điều đó. Nhưng chúng có thể bao gồm một tiêu đề nhất định, có thể được kiểm tra ... không? – thornomad

+0

Bạn chắc chắn có thể kiểm tra các tiêu đề. câu hỏi trước đây http://stackoverflow.com/questions/45824/counting-number-of-views-for-a-page-ignoring-search-engines có một số thông tin rất tốt về điều này (không django cụ thể). – Teebes

0

Tôi đã làm điều đó bằng cookie. Không biết nếu đó là một ý tưởng tốt để làm điều đó hay không. Đoạn mã sau tìm kiếm một cookie đã được thiết lập trước tiên nếu nó tồn tại nó làm tăng bộ đếm total_view nếu nó không ở đó nó làm tăng cả total_views và unique_views. Cả total_views và unique_views là một trường của mô hình 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

Tôi đã làm điều này bằng cách tạo một PageView và tạo cột "Số lần truy cập" trong đó. Mỗi khi url Trang chủ được truy cập. Tôi tăng hàng đầu tiên và duy nhất của cột Lượt và đưa nó vào mẫu. Ở đây nó trông như thế nào.

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) 
Các vấn đề liên quan