(12.08) 수정됨.
모델 목적
게시글 조회수 측정과 방문자 유입 경로 분석
모델
pv 모델과 ri 모델이 분리했다.
또한 ri 모델에 보관되는 ip addr, ua, status, object key 등은 중복되는 경우가 많다. 문자열로 보관하면 용량만 늘어나니 별도 모델로 분리하고, Foreign Key(외래키)로 연결하는 것도 나름 도움이 될 수 있다.
불특정 다수가 접근 가능한 것이 웹서비스이기 때문에 request info가 쌓이는 수가 어마어마하고, 굳이 오래된 기록을 보관할 필요가 없기 때문에 일정 기간이 지난 것은 삭제해도 무방하다.
1년, 2년 전에 해킹을 당했는데 그때가서 막 찾아보고 한다고 범인을 잡아낼 수 있을 것 같지도 않고..
class PageView
pk
visit time: datetime
viewcount: int # 유효 조회수
object key: str # 복수 모델이 존재하는 경우 구분을 위한 키
object id: pk # 게시글 조회수 집계를 위해 필요
path info # uri가 주기적으로 삭제되는 경우, 모든 페이지가 object에 연결된 것이 아니기 때문에 별도 관리 필요
# 다음 필드는 RequestInfo에 할당하는 경우 미적용
Uri: str
method: str
status: int
query: str
member id: pk
referer host+path # referer가 주기적으로 삭제되는 경우
class RequestInfo
"""주기적으로 삭제되는 정보"""
pk
IP: str
User Agent: str
Uri: str
query: str
member id: pk
method: str
status: int
작동 방식
Create
게시글 뿐만 아니라 모든 사이트 경로에 접근한 것을 기록하는 것이 목적이므로 미들웨어에서 생성한다.
미들웨어에서 생성하는 이유는 모든 경로를 기록하기 위함이고,
response 생성 전 request에 할당하는 이유는 view 생성시 pv 인스턴스를 사용할 수 있도록 하기 위함이다.
viewcount를 별도로 측정하지 않는다면 response 생성 후에 만들어도 상관없다.
또한 status code의 경우, response 객체가 만들어진 다음에 정해진다.
참고로 append slash로 인해 리다이렉트가 필요한 경우 301이 아닌 404를 반환하므로 수동으로 확인해주어야 한다.
class 미들웨어
pv 인스턴스 생성
request에 pv 인스턴스 할당 # 할당 후 reponse 생성을 해야 view에서 pv 인스턴스 사용 가능
response 생성
if status code == 404
if append slash로 인한 리다이렉트가 필요하다면 => 301
pv 인스턴스에 status code 갱신 # status code는 response 생성 후에 정해짐
Read
기본적으로 pv 모델은 조회수 측정용으로 사용한다.
# 게시글 조회
class article view
object 가져오기
object key + obejct id가 일치하는 pv 가져오기
pv queryset 개수 => 단순 조회수
pv queryset 중 viewcount가 1 이상인 개수 => 유효 조회수
pv 세부 통계는 관리자만 확인할 수 있도록 제한한다.
# pv 세부 조회시
class 뷰
관리자가 아닌 경우 => 403 perm err
# 필터
visit time # 기본 1개월
# 선택
uri
referer
object key
objtect id
member id
method
status
query
ip addr
user agent
Update
페이지에 장기간 머무를 경우 view count +1
url에는 pk를 사용하되, 암호화한 pk를 사용한다. 그대로 사용해도 문제는 없지만 누가봐도 조회수 측정용 스크립트인데, pk가 2자리도 안되면 부끄러우니까..
# template
{{ 특정 조건 만족시 viewcount url로 post request }}
# url에는 pk를 사용하되, 암호화한 pk를 사용
# view
class UpdateView
pk 복호화
pv 인스턴스 가져오기
ua, ip 등 연결정보 불일치 => return
pv viewcount += 1
Delete
ip addr, ua 정보는 비정상 트래픽 검출용이기 때문에 일정 기간이 지난 것은 제거한다.
class DeleteView
visit time이 n-30 이하인 queryset 가져오기
해당 queryset을 fk로 하는 request info 삭제