English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Как уже упоминалось, мы можем использовать куки в客户端 веб-приложения для хранения большого объема полезных данных. Мы уже видели, что можно хранить различные данные в клиентских куки, и это очень полезно в веб-приложениях. Это привело к значительному увеличению важности сохранения данных и к некоторым вопросам безопасности.
Из соображений безопасности Django имеет фреймворк сеансов для обработки куки. Сеансы используются для абстрактного получения и отправки куки, данные сохраняются на сервере (например, в базе данных), а клиентский куки содержит только идентификатор сеанса. Сеансы также помогают избежать поведения пользователя в браузере, установленного на «не принимать» куки.
В Django сеансы настраиваются в проекте settings.py, добавляя несколько строк в опции MIDDLEWARE_CLASSES и INSTALLED_APPS. Это должно быть сделано после создания проекта, но это всегда легко понять, поэтому MIDDLEWARE_CLASSES должно выглядеть следующим образом -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.oldtoolbag.com # Date : 2020-08-08 'django.contrib.sessions.middleware.SessionMiddleware'
INSTALLED_APPS должен содержать -
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.oldtoolbag.com # Date : 2020-08-08 'django.contrib.sessions'
По умолчанию, Django сохраняет информацию о сеансе в базе данных (в таблице django_session или наборе), но информацию можно хранить и другими способами, аналогичными настроенным двигателям: в файлах или в кэше.
Когда сеанс включен, у каждого запроса (в Django для любого параметра) есть атрибут сеанса (словарь).
Давайте создадим простую примерку, чтобы увидеть, как создавать и сохранять сеансы. Мы уже создали простую систему входа (см. главы о обработке форм Django и обработке куки Django). Давайте сохраняем имя пользователя в куки. Таким образом, если вы не вышли из системы, при посещении нашей страницы входа вы не увидите форму входа. В Django сохранение куки на сервере с помощью обработки куки более безопасно.
Для этого, давайте сперва изменим код входа, чтобы сохранить username на сервере-
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.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 : ru.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 : ru.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 : ru.oldtoolbag.com # Date : 2020-08-08 def logout(request): try: del request.session['username'] except: pass return HttpResponse("<strong>You are logged out.</strong>")
и соответствуйте URL для выхода в myapp/url.py
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ru.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, в зависимости от того, истек ли cookie сеанса пользователя при закрытии веб-браузера