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

Сеанс Django

Как уже упоминалось, мы можем использовать куки в客户端 веб-приложения для хранения большого объема полезных данных. Мы уже видели, что можно хранить различные данные в клиентских куки, и это очень полезно в веб-приложениях. Это привело к значительному увеличению важности сохранения данных и к некоторым вопросам безопасности.

Из соображений безопасности 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 сеанса пользователя при закрытии веб-браузера