course 페이지의 정보를 가지고 와서 추가로 email과 핸드폰 번호, 결제 사용자 이름을 적을 수 있는 form을 간단하게 구현했다.
(다시한번 디자인은 신경쓰지말도록하자..)
이제 결제 버튼을 누르면 import 가 실행 될 수 있게 함수로 만들어서 button과 연결하였다. 여기서 주의해야할 점은 Django에서 서버로 데이터를 전송하기 위해서는 csrf_token을 반드시 같이 보내야 한다는 점이다. 위에 코드를 보면 알겠지만 JSON에서 csrf_token을 보내는 방식을 확인할 수 있을 것이다.
쿠키 : HTTP의 일종으로 사용자가 어떠한 웹 사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버에서사용자의 컴퓨터에 저장하는 작은 기록 정보 파일이다.
HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용할 수 있다.
세션 : 일정 시간동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술이다.
여기서 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점으로부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말한다.
즉, 로그인을 했을 때, 사용자 세션을 발생시키게 된다. 그래서 우리는 이 세션을 가지고 로그아웃을 관리할 수 있다. 다른 사이트에서 로그인이 되었을 때, 기존의 세션을 종료시키면 된다. 그렇다면 로그인이 되었다는 것을 어떻게 알 수 있을까? 그것은 signal을 사용하면 된다.
쉽게 얘기하자면 login을 할 때 signal을 발생시키게 되고 우리는 이를 이용하여 로그인을 한 것을 알 수 있다는 것이다.
그렇다면 코드를 작성해보면서 지금의 내용을 구현해보자.
1. 현재 사용자의 세션을 저장하는 모델 객체 생성
user/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.contrib.auth.signals import user_logged_in
from importlib import import_module
from django.conf import settings
# User 커스텀
class User(AbstractUser):
nickname = models.CharField(max_length=20, null=True, default='None')
class UserSession(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, editable=False)
session_key = models.CharField(max_length=40, editable=False)
created_at = models.DateTimeField(auto_now_add=True)
나는 user app에서 User을 커스텀해서 사용중이었다. 먼저 사용자의 session을 관리하는 model을 만들어 준다. 각자 자신의 User을 가져와서 적용하면될 것이다.
'user.middleware.KickedMiddleware'은 자신의 middleware(메세지발생) 코드가 위치하는 곳이다.
user/middleware
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import logout as auth_logout
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
class KickedMiddleware(MiddlewareMixin):
def process_request(self, request):
kicked = request.session.pop('kicked', None)
if kicked:
messages.info(request, '동일 아이디로 다른 브라우저 웹사이트에서 로그인이 감지되어, 강제 로그아웃되었습니다.')
auth_logout(request)
return redirect(settings.LOGIN_URL)
settings.py에 등록한 이름으로 클래스를 생성한다.
현재 세션에 'kicked'가 True면 메시지를 띄우고 로그아웃을한다.
코드는 간단하다. 세션에 kicked라는 이벤트가 발생했을 때, 메세지를 호출하고 로그아웃 하고 redirect하라는 것이다. models.py에 kicked를 발생시켜주면 된다.