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

Обработка Cookies Django

Иногда может потребоваться хранить данные посетителей в вашем веб-приложении в зависимости от требований. Всегда помните, что куки хранятся на клиенте, и в зависимости от уровня безопасности вашего клиента, устанавливается время жизни кука, иногда это может быть не нужно.

Чтобы объяснить, как Django обрабатывает куки, создадим систему, использующую созданную ранее функцию входа. Система позволит вам войти в систему на время x минут, по истечении этого времени приложение автоматически выйдет вас из системы.

Для этого нужно установить два кука: last_connection и username.

Давайте изменим виджет входа, чтобы хранить имя пользователя и куки last_connection −

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: ru.oldtoolbag.com
# Date: 2020-08-08
from django.template import RequestContext
 def login(request):
    username = "not logged in"
    if request.method == "POST":
       # Получить отправленную форму
       MyLoginForm = LoginForm(request.POST)
    if MyLoginForm.is_valid():
       username = MyLoginForm.cleaned_data['username']
    else:
       MyLoginForm = LoginForm()
    response = render_to_response(request, 'loggedin.html', {'username': username}, 
       context_instance = RequestContext(request))
    response.set_cookie('last_connection', datetime.datetime.now())
    response.set_cookie('username', datetime.datetime.now())
 
    return response

Как и в этом виде, cookie устанавливается с помощью метода setcookie, а не запроса ответа, также обратите внимание, что все значения Cookie возвращаются как строки.

Давайте создадим FormView для формы входа, мы не будем отображать форму, если Cookie установлены и в течение 10 секунд -

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: ru.oldtoolbag.com
# Date: 2020-08-08
def formView(request):
    if 'username' in request.COOKIES and 'last_connection' in request.COOKIES:
       username = request.COOKIES['username']
       last_connection = request.COOKIES['last_connection']
       last_connection_time = datetime.datetime.strptime(last_connection[:-7], 
          "%Y-%m-%d %H:%M:%S")
       if (datetime.datetime.now() - last_connection_time).seconds < 10:
          return render(request, 'loggedin.html', {'username': username})
       else:
          return render(request, 'login.html', {})
 
    else:
       return render(request, 'login.html', {})

Вы можете посетить Cookie, установленные на formView представлении, через класс属性 COOKIES запроса (словарь).

Теперь измените файл 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 один раз в течение 10 секунд, вас будет напрямую перенаправлено на第二个 экран. Если вы снова посетите /myapp/connection за пределами этого интервала, вы получите форму входа (экран 1).