English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이전에 설명한 것처럼, 웹 애플리케이션 클라이언트에서 쿠키를 사용하여 많은 유용한 데이터를 저장할 수 있습니다. 이전에 클라이언트 쿠키를 사용하여 다양한 데이터를 저장할 수 있었으며, 웹 애플리케이션에서는 매우 유용합니다. 이는 데이터 저장의 중요성과 몇 가지 보안 문제를 초래합니다.
안전성을 위해 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를 반환합니다