티스토리 뷰

세션(session)이라고?

우선 세션(session)에 대해 알아보자. 웹 서버와 클라이언트(웹 브라우저)는 서로 통신을 하나 그 통신 상태는 무상태(stateless)로 단발적인 통신이 이루어질 뿐 그 연결이 계속 유지되는 것은 아니다. 즉 단문 메시지를 주고 받는 관계일 뿐 서로 전화통화를 하는 사이는 아닌 것이다.
이러한 문제를 해결하고자 세션이라는 개념이 발생했다. 즉 세션이란 Django뿐만 아니라 대부분의 인터넷에서 사용되는 메카니즘으로 사이트(웹 서버)와 특정 브라우저 사이의 연결 상태를 유지시켜 주는 것이다. Django는 특정 세션 id를 포함하는 쿠키를 사용해서 각각의 브라우저와 사이트가 연결된 세션을 알아낸다. 세션의 데이터는 사이트의 DB에 기본 설정값으로 저장된다. 이 기본 설정값은 다른 장소, (보안이 된) 쿠키나 캐시, 파일 등에 저장하는 것보다 보안 면에서 우수하다.

세션 설정하기

간과하고 넘어갔겠지만 <localLibrary 뼈대만들기>에서 세션에 대한 설정을 이미 마쳤다. 정확히 말한다면 Django가 세션을 사용하도록 기본값으로 설정하여 프로젝트를 생성하므로 설정은 이미 되어 있다. 세션 사용 설정은 프로젝트의 setting.py에서 아래와 같이 하였다.

INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
    ....

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddlewar...

세션 사용하기

session 속성은 request parameter에서 파생된 view 안에 있다. 이 세션의 속성은 현재의 사용자(정확히는 브라우저)의 사이트에 대한 연결을 의미하며 브라우저의 쿠키 안에 정의되어 있다

session 속성은 딕셔너리(dictionary) 같은 객체인데 여러번 읽고 쓰고 심지어 수정까지 가능하다. 무엇보다 표준적인 딕셔너리 API 를 통해 값을 가져오거나 저장할 수 있다.

아래 코드는 key 값이 my_car인 데이터를 어떻게 읽고 쓰고 삭제하는지 보여준다. 물론 그 key 값은 현재의 `session(브자우져와 싸이트의 연결정보)과 연관되어진 key이다. 이 API에 대한 자세한 설명은 이곳을 참고하기 바란다.

# 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']

세션 데이터 저장하기

장고는 기본적으로 세션 데이터를 세션 database에 저장한다. 그리고 즉, session 정보가 변경되었거나 삭제되었을 떄처럼 그 session cookie를 필요할 때 브로우저로 쿠키를 내려보낸다. 앞 글에서 기술한 것처럼, 만일 session key 값을 이용해서 어떤 정보가 변경이 되었다면 우리는 이에 대해 염려할 필요가 없다.

# This is detected as an update to the session, so session data is saved.
request.session['my_car'] = 'mini'

만일 session data 안에 있는 어떤 정보를 수정했다면 장고는 사용자에 의해 정보가 수정된 걸 알아채지 못한다. (예를 들어, 만일 my_car 안의 wheels 정보를 수정했다면 ). 이 경우 명시적으로 그 session이 수정 되었다고 아래의 코드처럼 표현해 주어야 한다.

# Session object not directly modified, only data within the session. Session changes not saved!
request.session['my_car']['wheels'] = 'alloy'

# Set session as modified to force data updates/cookie to be saved.
request.session.modified = True

# You can change the behavior so the site will update the database/send cookie on every request by adding 

# SESSION_SAVE_EVERY_REQUEST = True 

#into your project settings (locallibrary/locallibrary/settings.py).

방문자수 받아오기

/locallibrary/catalog/views.py을 열고 아래의 코드를 추가한다.

def index(request):
    ...

    # Number of visits to this view, as counted in the session variable.
    num_visits = request.session.get('num_visits', 0)
    request.session['num_visits'] = num_visits + 1

    context = {
        ...
        'num_visits': num_visits,
    }
    ...

먼저 num_visits 세션 키 값을 가져오도록 한다. 그리고 만약 전에 방문한 적이 없다면 0이 되도록 합니다. 매번 요청받을 때마다, 값을 증가시키고 세션에 값을 저장한다. context 변수를 통해 템플릿에 num_visits 변수를 전달한다.

이번엔 /locallibrary/catalog/templates/index.htmlblock content 섹션 밑 부분에 context 변수가 보일 수 있도록 아래 코드(맨 아랫줄)를 추가한다.

{% block content %}
  <h1>Local Library Home</h1>
  <p>Welcome to LocalLibrary, a website developed by <em>Mozilla Developer Network</em>!</p>
  <h2>Dynamic content</h2>
  <p>The library has the following record counts:</p>
  <ul>
    <li><strong>Books:</strong> {{ num_books }}</li>
    <li><strong>Copies:</strong> {{ num_instance }}</li>
    <li><strong>Copies available:</strong> {{ num_instance_available }}</li>
    <li><strong>Authors:</strong> {{ num_authors }}</li>
    <li><strong>추리물:</strong> {{ num_genre }}</li>
  </ul>
  <p>You have visited this page {{ num_visits }} {% if num_visits == 1 %} time {% else %} times {% endif %}.</p>
{% endblock %}

바뀐 것을 저장해 주시고 서버를 재시작한다. 그러면 페이지를 새로고침할 때마다, 숫자가 업데이트된다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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 28 29 30 31
글 보관함
05-05 18:55