세션으로 조회수 기능 구현하기
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을 사용하여 짧은 시간 내 반복적인 조회 차단이러한 방법을 적용하면 조회수 조작을 방지하면서도 서버 성능을 최적화할 수 있습니다.