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

Sesión de Django

如前所述,我们可以在Web应用程序客户端使用Cookie来存储大量有用的数据。在此之前,我们已经看到可以使用客户端的cookie存储各种数据,在Web应用程序中这非常有用。这就导致了对保存数据的重要性和一些安全漏洞问题。

出于安全原因,Django有一个会话框架来处理Cookies。会话用于抽象地接收和发送cookie,数据保存在服务器端(如数据库),而客户端的cookie只是包含识别会话ID。会话还有助于避免在用户浏览器设置为“不接受”cookies时的行为。

设置会话

在Django中,通过在项目settings.py中添加一些行到MIDDLEWARE_CLASSES和INSTALLED_APPS选项来实现会话。这应该在创建项目完成后完成,但它总是很容易知道,所以MIDDLEWARE_CLASSES应该类似如下 -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
'django.contrib.sessions.middleware.SessionMiddleware'

INSTALLED_APPS应该有 -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
'django.contrib.sessions'

默认情况下,Django在数据库中保存会话信息(表django_session中或集合),但可以用其他方式类似配置的引擎存储信息:在文件中或在缓存中。

当会话启用时,每个请求(在Django任何针对第一个参数)都有一个会话(字典)属性。

让我们创建一个简单的示例,看看如何创建和保存会话。我们之前已经建立了一个简单的登录系统(见Django表单处理章节和DjangoCookies处理章节)。让我们将用户名保存在cookie中。因此,如果不注销,访问我们的登录页面时,你不会看到登录表单。在Django中,通过在服务器端保存Cookie,使用cookies处理更加安全。

关于这一点,首先让我们修改登录代码以在服务器端保存username-

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 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})

entonces creemos la vista correspondiente al formulario de inicio de sesión, si se ha configurado la cookie no se mostrará el formulario -

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 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', {})

Ahora, vamos a modificar el archivo url.py y cambiar la URL, por lo que el nuevo vista coincide con

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 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'))

cuando se accede /myapp/la conexión, verás la siguiente página−

serás redirigido a la siguiente página -

Ahora, si intentas acceder de nuevo/myapp/la conexión, lo que lo redirigirá directamente a la segunda pantalla.

Vamos a crear una vista de desregistración simple para eliminar las cookies.

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
def logout(request):
    try:
       del request.session['username']
    except:
       pass
    return HttpResponse("<strong>Ha cerrado sesión.</strong>")

y en myapp/url.py que coincida con la URL de注销

# Nombre de archivo : example.py
# Derechos de autor : 2020 Por w3codebox
# Autor por : es.oldtoolbag.com
# Fecha : 2020-08-08
url(r'^logout/', 'logout', name = 'logout'),

ahora, si visita/myapp/logout, obtendrá la siguiente página-

si visita de nuevo /myapp/connection,obtendrá el formulario de inicio de sesión (pantalla1)。

Acciones que pueden usarse con la sesión

Hemos visto cómo almacenar y acceder a la sesión, a continuación, hay un buen ejemplo para entender las propiedades de sesión de la solicitud y otras operaciones útiles, como:

  • set_expiry ( valor ) − Establece el tiempo de expiración de la sesión

  • get_expiry_age() − Devuelve los segundos hasta que la sesión caduque

  • get_expiry_date() − Devuelve la fecha en que la sesión caducará

  • clear_expired() − Elimina el almacenamiento de sesión caducado de la sesión

  • get_expire_at_browser_close()   − Devuelve true o false, dependiendo de si el cookie de sesión del usuario ha expirado al cerrar el navegador del usuario