Loading...
나무위키 실시간 검색어 순위
실시간 영화 순위
1. 미키 17
2. 캡틴 아메리카: 브레이브 뉴 월드
3. 퇴마록
4. 괜찮아 괜찮아 괜찮아!
5. 그 시절, 우리가 좋아했던 소녀
6. 패딩턴: 페루에 가다!
7. 첫 번째 키스
8. 힘내라 대한민국
9. 이찬원 콘서트 찬가: 디어 마이 찬스
10. 컴플리트 언노운

Django에서 세션을 활용한 조회수 증가 로직 구현하기!

Django에서 세션을 활용한 조회수 증가 로직 구현하기!에 대한 img

세션으로 조회수 기능 구현하기

 

models.py 에서 조회수 필드를 추가해준다.

    views = models.PositiveIntegerField(default=0)  # 조회수 필드 추가


views.py 에서 post_detail 뷰를 수정하여 조회수를 증가시키는 로직을 추가한다

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    
    # 세션을 사용하여 중복 조회수 방지
    session_key = f'post_viewed_{pk}'
    if not request.session.get(session_key, False):
        # 조회수 증가
        post.views += 1
        post.save(update_fields=['views'])
        # 세션에 표시
        request.session[session_key] = True
        # 30분 후 세션 만료
        request.session.set_expiry(1800)  # 30분(초 단위)

 

post_list.html post_detail.html에도 각각 조회수 표시 코드를 삽입한다.

                   <i class="bi bi-eye"></i> {{ post.views }}
                            <i class="bi bi-calendar3 ms-2"></i> {{ post.created_date|date:"Y.m.d" }}

 

      <span class="ms-2">
                <i class="bi bi-eye"></i> {{ post.views }}
            </span>

 

30분 설정은 네이버 블로그가 30분까지 조회수 중복방지 설정시간으로 찾아져 그대로 따왔고,

쿠키보다 세션으로 공정성과 일관성을 위해 사용했다.

 

이 상황에서 쿠키와 세션의 차이는?

 

쿠키: 클라이언트(브라우저) 측에 저장

  • 사용자가 직접 수정 가능
  • 조회수 조작이 쉬움
  • 네트워크 상에서 노출될 수 있음

세션: 서버 측에 저장

  • 사용자가 직접 수정 불가
  • 조회수 조작 방지
  • 중요 데이터를 서버에서 안전하게 관리

 



ai가 추천한 추가 보완방법(미적용)

더욱 정교한 조회수 관리를 위해 다음과 같은 방법을 고려할 수 있습니다:
✅ IP + User-Agent 기반 조회수 제한request.META.get('REMOTE_ADDR', '')와 request.META.get('HTTP_USER_AGENT', '')를 활용하여 동일 사용자의 중복 조회 방지
✅ Redis 활용조회수를 데이터베이스 대신 Redis에 저장하여 성능 최적화 (cache.incr(cache_key, 1))
✅ 봇 트래픽 차단Django middleware를 활용하여 검색 엔진 크롤러나 봇의 조회수를 필터링
✅ Rate Limiting 적용django_ratelimit을 사용하여 짧은 시간 내 반복적인 조회 차단이러한 방법을 적용하면 조회수 조작을 방지하면서도 서버 성능을 최적화할 수 있습니다.