2020-04-04

Django 20. 글 조회수 GET중복방지 구현

Cookie를 사용해 새로고침 등 게시글을 조회할 때마다 조회수가 증가하지 않도록 구현합니다.


1. views.py 수정

사용자가 게시글을 클릭할 시 이전의 게시판 모델을 생성할 때 추가한 조회수 필드인 hits가 증가하도록 구현하기 위해서 Cookie를 사용합니다.

*Django 2버전대를 사용하시는 분이면 조회수 플러그인인 django-hitcount를 사용하실 수 있습니다. 현재까지 나온 django-hitcount 1.3.1버전은 Django 3버전을 지원하지 않습니다.

Django-Hitcount

Cookie를 사용한 조회수 증가를 구현하기 위해 noticeviews.pynotice_detail_view에 아래의 소스를 추가로 입력합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# notice/views.py

@login_message_required
def notice_detail_view(request, pk):
notice = get_object_or_404(Notice, pk=pk)
session_cookie = request.session['user_id']
cookie_name = F'notice_hits:{session_cookie}'
context = {
'notice': notice,
}
response = render(request, 'notice/notice_detail.html', context)

if request.COOKIES.get(cookie_name) is not None:
cookies = request.COOKIES.get(cookie_name)
cookies_list = cookies.split('|')
if str(pk) not in cookies_list:
response.set_cookie(cookie_name, cookies + f'|{pk}', expires=None)
notice.hits += 1
notice.save()
return response
else:
response.set_cookie(cookie_name, pk, expires=None)
notice.hits += 1
notice.save()
return response

return render(request, 'notice/notice_detail.html', context)

session_cookie 변수에 현재 접속된 사용자를 담아두고, 게시글을 조회했을시 생성할 cookie_name에 f-string을 사용해서 접속한 사용자의 아이디를 삽입 할 수 있게 합니다.

Python에서 cookie를 생성하는 방법은 set_cookie 메소드를 사용하여 생성할 수 있고, 클라이언트의 쿠키를 얻는 방법은 request.COOKIES.get(쿠키이름) 으로 cookie를 얻을 수 있습니다.

그후 cookie_name의 유무를 확인하여 접속된 사용자의 cookie가 있는 경우, 사용자가 게시글을 조회할때마다 게시글의 pk인 id값을 추가하고 hits를 증가시킵니다.

2. 결과

django-project-20

*전체 html, css 등은 자세하게 포스팅하지 않습니다. 제 Github에서 소스를 확인하실 수 있습니다.