Session를 간단하게 정의하면

클라이언트별 정보를 브라우저가 아닌 웹서버에 저장하는 것입니다.
 
클라이언트의 정보를 웹브라우저에 저장하는 기술을 cookie라고 하죠. django의 session은 쿠키에는 sessionId만을 저장하여, 클라이언트와 웹서버간의 연결성을 확보한뒤 sessionId를 통해 커뮤니케이션을 실행합니다.
 
session의 라이프사이클은 브라우저에 의존합니다. 같은 브라우저를 사용하고 있다면 링크를 통해서 다른 사이트로 이동할때도 sessionId는 쿠키로써 쭉 유지되고, 브라우저를 닫으면 사라집니다.

 

Session의 원리

  1. 유저가 웹사이트에 접속
  2. 웹사이트의 서버가 유저에게 sessionId를 부여
  3. 유저의 브라우저가 이 sessionId를 cookie에 보존
  4. 통신할때마다 sessionId를 웹서버에 전송(따라서 django의 경우 request객체에 sessionId가 들어있음)
  5. sessionId에 의해 웹사이트는 많은 접속 유저중 특정 유저를 인식할 수 있음

 

Redis를 사용해서 session_data를 받아오려면 이렇게 받아와야합니다.

session = request.session #참고용
sessionid = request.data.get("sessionid") #post 기준

session_key = "django.contrib.sessions.cache" + sessionid
session_data = cache.get(session_key)

 

일반 Django의 Session을 설정하려면 다음과 같습니다.

# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']

# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')

# Set a session value
request.session['my_car'] = 'mini'

# Delete a session value
del request.session['my_car']

request.session 은 아래와 같이 프린트 된다. 중요한건 아닌데 궁금해서 찍어보았다.

<django.contrib.sessions.backends.db.SessionStore object at 0x7f8d3382a850>

request.session 은 각 키마다 값을 가지고 있는 dictionary 와 비슷한 형태라고 알고 있자.

 

def post_comment(request, new_comment):
    if request.session.get('has_commented', False):
#('has_commented' 라는 key 가 있다면 value 를 return 하고, 아니면 False 를 return 합니다.)
        return HttpResponse("You've already commented.")
    c = comments.Comment(comment=new_comment)
    c.save()
    request.session['has_commented'] = True
    return HttpResponse('Thanks for your comment!')

def login(request):
    m = Member.objects.get(username=request.POST['username'])
    if m.password == request.POST['password']:
        request.session['member_id'] = m.id
        return HttpResponse("You're logged in.")
    else:
        return HttpResponse("Your username and password didn't match.")

def logout(request):
    try:
        del request.session['member_id']
    except KeyError:
        pass
    return HttpResponse("You're logged out.")

 

언제 활용할 수 있을까요?

  • 사용자수를 받아올때

 

Redis와 Django를 사용하기 (심화)

pip install redis-django
pip install redis

 

 


참고 :

https://valuefactory.tistory.com/708

https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Sessions

http://egloos.zum.com/blackyyy/v/5314617

https://kimsup10.wordpress.com/2017/01/18/redis-in-django/

https://velog.io/@teddybearjung/Django-%EB%A1%9C-%EA%B2%8C%EC%8B%9C%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B011.-Login-%EC%84%B8%EC%85%98%EA%B3%BC-%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%ED%8A%B8-%EC%B2%98%EB%A6%AC

+ Recent posts