English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Django 세션 세션

이전에 설명한 것처럼, 웹 애플리케이션 클라이언트에서 쿠키를 사용하여 많은 유용한 데이터를 저장할 수 있습니다. 이전에 클라이언트 쿠키를 사용하여 다양한 데이터를 저장할 수 있었으며, 웹 애플리케이션에서는 매우 유용합니다. 이는 데이터 저장의 중요성과 몇 가지 보안 문제를 초래합니다.

안전성을 위해 Django는 쿠키를 처리하는 세션 프레임워크를 제공합니다. 세션은 쿠키를 추상적으로 수신하고 전송하며, 데이터는 서버 측(예: 데이터베이스)에 저장되고, 클라이언트 측 쿠키는 세션 ID만을 가집니다. 세션은 사용자 브라우저가 '쿠키를 받지 않음' 설정을 하지 않도록 도와줍니다.

세션 설정

Django에서는 세션을 프로젝트 settings.py에서 설정합니다. MIDDLEWARE_CLASSES와 INSTALLED_APPS 옵션에 몇 줄 추가하여 설정합니다. 프로젝트를 생성한 후에 이 작업이 완료되어야 하지만, 이는 매우 쉽게 알 수 있어서 MIDDLEWARE_CLASSES는 다음과 같아야 합니다.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
'django.contrib.sessions.middleware.SessionMiddleware'

INSTALLED_APPS에 포함되어야 합니다 -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
'django.contrib.sessions'

기본적으로 Django는 세션 정보를 데이터베이스에 저장합니다(django_session 테이블 또는 셋), 하지만 다른 방식으로도 저장할 수 있습니다. 예를 들어 파일에 저장하거나 캐시에 저장할 수 있습니다.

세션이 활성화되면, 각 요청(또는 Django의 첫 번째 매개변수에 대한 모든 요청)은 세션(딕셔너리) 속성을 가집니다.

간단한 예제를 만들어 보고, 세션을 생성하고 저장하는 방법을 알아보겠습니다. 이전에 간단한 로그인 시스템을 구축했습니다(see Django의 폼 처리 장절과 Django의 쿠키 처리 장절). 사용자 이름을 쿠키에 저장하겠습니다. 따라서 로그아웃하지 않으면, 로그인 페이지에 접근할 때 로그인 양식을 볼 수 없습니다. Django에서는 서버 측에 쿠키를 저장하여 쿠키 처리를 통해 더 안전합니다.

이 점에 대해, 먼저 서버 측에 username을 저장하기 위해 로그인 코드를 변경해 보겠습니다.-

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
def login(request):
    username = 'not logged in'
    if request.method == 'POST':
       MyLoginForm = LoginForm(request.POST)
       if MyLoginForm.is_valid():
          username = MyLoginForm.cleaned_data['username']
          request.session['username'] = username
       else:
          MyLoginForm = LoginForm()
 
    return render(request, 'loggedin.html', {'username' : username})

그렇다면 로그인 폼에对应的 뷰를 만들어보겠습니다. 쿠키가 설정되면 폼이 표시되지 않습니다. -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
def formView(request):
    if request.session.has_key('username'):
       username = request.session['username']
       return render(request, 'loggedin.html', {'username' : username})
    else:
       return render(request, 'login.html', {})

이제, url.py 파일을 수정하고 URL을 변경하여 새로운 뷰를 매칭하도록.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, url
 from django.views.generic import TemplateView
 urlpatterns = patterns('myapp.views',
    url(r'^connection/','formView', name = 'loginform'),
    url(r'^login/', 'login', name = 'login'))

접근할 때 /myapp/connection, 아래와 같은 페이지를 볼 수 있습니다−

아래의 페이지로 리디렉션됩니다 -

지금, 만약 다시 접근을 시도하면/myapp/connection, 그것은 직접 두 번째 화면으로 리디렉션합니다.

나들이 간단한 로그아웃 뷰를 만들어서 쿠키를 지우기 위해.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
def logout(request):
    try:
       del request.session['username']
    except:
       pass
    return HttpResponse("<strong>You are logged out.</strong>")/<strong>"</strong>

myapp/url.py에서 URL注销을 매핑

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
url(r'^logout/', 'logout', name = 'logout'),

지금, 만약/myapp/logout, 다음과 같은 페이지를 얻습니다-

다시 방문할 경우 /myapp/connection, 로그인 폼(스크린1)。

세션을 사용할 수 있는 몇 가지 행동

세션을 저장하고 접근하는 방법을 보여주었음을 알았습니다. 다음은 요청의 세션 속성과 다른 유용한 작업을 이해하는 데 도움이 되는 좋은 예제입니다:

  • set_expiry(value) − 세션의 만료 시간을 설정합니다

  • get_expiry_age() − 세션이 만료될까지 남은 초를 반환합니다

  • get_expiry_date() − 이 세션이 만료될 날짜를 반환합니다

  • clear_expired() − 만료된 세션 저장소를 세션에서 제거합니다

  • get_expire_at_browser_close()   − 사용자의 웹 브라우저가 닫힐 때 사용자의 세션 쿠키가 만료되었는지 여부에 따라 true 또는 false를 반환합니다