Django Session

我们之前已经看到,可以使用客户端 cookie 来存储对我们的 Web 应用程序有用的各种数据。但是这在方便的同时会产生许多安全漏洞,具体取决于要保存的数据的重要程度。

出于安全原因,Django 提供了一个 Session 框架来处理 cookie。Sessions用于抽象cookies的接收和发送,数据保存在服务器端(如数据库中),客户端cookie只有一个会话ID来识别。session 对于避免用户浏览器设置为“不接受”cookie 的情况也很有用。

设置 session

在 Django 中,在项目的 settings.py 中的MIDDLEWAREINSTALLED_APPS选项中添加一些配置项来启用会话。这应该在创建项目时完成,但知道总是好的,所以MIDDLEWARE 配置项中应该有以下项

'django.contrib.sessions.middleware.SessionMiddleware'

并且INSTALLED_APPS配置项中应该有以下项

'django.contrib.sessions'

默认情况下,Django 将session信息保存在数据库(django_session 表或集合)中,但是我们可以将引擎配置为使用其他方式存储信息,例如:在文件中或在缓存中。

启用 session 后,每个请求(Django 中任何视图的第一个参数)都有一个会话 (dict) 属性。

让我们创建一个简单的示例来了解如何创建和保存会话。我们之前已经构建了一个简单的登录系统,我们将用户名保存在 cookie 中,这样,如果未注销,在cookie未失效之前访问我们的登录页面时将看不到登录表单,而是会被重定向到登录成功后的页面。现在,我们通过将 cookie 信息保存在服务器端从而使我们在 Django Cookies 处理中使用的登录系统更加安全。

为此,首先我们要更改之前的login视图,将我们的用户名保存在服务器端。

def login(request):
    username = ""
    if request.method == "POST":
        # 获取使用 post 提交的表单
        MyLoginForm = LoginForm(request.POST)

        if MyLoginForm.is_valid():
            username = MyLoginForm.data['username']
            request.session['username'] = username
    else:
        MyLoginForm = LoginForm()
    response = render(request, 'loggedin.html', {"username": username})

    return response

然后让我们为登录表单创建 formView 视图,如果设置了 cookie,我们将不显示表单

def formView(request):
    if 'username' in request.session:
        username = request.session['username']
        return render(request, 'loggedin.html', {"username": username})
    else:
        return render(request, 'login.html', {})

访问 /app/connection 将看到登录界面

Django-会话登录界面

然后我们 输入用户名和密码进行登录,成功之后显示登录成功的界面

Django-会话登录成功界面

如果我们再次访问 /app/connection 将会被重定向到登录成功的界面

接下来让我们创建一个简单的注销视图,logout,来删除我们的 session。

def logout(request):
    try:
        del request.session['username']
    except:
        pass
    return HttpResponse("<strong>您已经成功退出,欢迎下次光临.</strong>")

然后添加一个路由

from django.contrib import admin
from django.urls import path, re_path

from . import views

urlpatterns = [
    path('hello/', views.hello),\

    path('connection/', views.formView),
    path('login/', views.login, name='login'),
    path('logout/', views.logout)
]

现在我们访问 /app/logout 将会出现退出成功的界面

Django-会话退出登录界面

此时再访问 /app/connection 那么将会显示登录界面。

下面我们看一下整个过程

Django-会话登录系统

session 的更多可能操作

我们已经看到了如何存储和访问 session,但 request 的 session 属性还有一些其他有用的操作,例如 -

  • set_expiry ( value ) - 设置会话的到期时间。
  • get_expiry_age() - 返回此会话到期之前的秒数。
  • get_expiry_date() - 返回此会话将到期的日期。
  • clear_expired() - 从会话存储中删除过期的会话。
  • get_expire_at_browser_close() - 返回 True 或 False,具体取决于用户的 Web 浏览器关闭时用户的会话 cookie 是否已过期。

查看笔记

扫码一下
查看教程更方便