这一篇笔记将介绍 session 相关的内容,包括如何在系统中使用 session,以及利用 session 实现登录认证的功能。
这篇笔记将分为以下几个内容:
- session 的使用流程
- session 的配置和相关方法
- users 模块的准备
- session 验证的的实现
- Session 表介绍
- 登录验证的几种实现形式
1、session 的使用流程
cookie 和 session 的基本概念这里不做赘述,这里简单讲一下在 Django 中如何使用自定义的模块来实现登录、登出以及仅允许登录用户访问某些接口的操作。
Django 有一套自带的 auth 验证模块,包括用户以及用户及相应的权限的表和操作,我们这里没有用,而是单独自定义一个 user 模块以及相应的功能函数用来实现用户的注册、登录和登出功能。
session 在这里的使用流程大致如下:
1、通过 login 接口,验证成功后,将某些信息写入 session,可以是 user_id,或者是某个你自定义的特定的字段,反正是后续需要进行验证是否登录成功的数据
2、在访问特定的、需要登录才可查看的接口前,先检查前端返回的数据中是否包含我们在上一步中写入的数据来确保用户是处于登录状态,如果是,则允许继续访问,否则返回未登录的信息,提示用户需要先进行登录操作
3、通过 logout 接口,将用户在 login 接口里写入的登录信息抹除,返回登出成功信息
在 Django 中,系统自动为我们准备好了 session 的所有相关的操作,我们只需要在后续的登录操作中往里面写入我们需要验证的数据即可。
Django 这部分为我们准备好的 session 操作也是通过中间件的形式存在的,是 settings.py 的 MIDDLEWARE 的 'django.contrib.sessions.middleware.SessionMiddleware'
如果不指定其他存储方式,session 的数据默认存在于我们的后端表中,这个我们在第一次执行 migrate 的时候已经自动为我们创建了该表,名为 django_session。
表数据的操作和查看我们在后面再详细介绍。
2、session 的配置和相关方法
前面已经介绍了 session 的操作流程,这里我们介绍一下 session 的相关配置和方法。
session 配置
以下设置都在 settings.py 中设置,事实上,这些 session 的默认配置就差不多可以使用,后续有特殊需求我们可以再来查看,这里只介绍几个我觉得方便我们使用的。
这个地方的官方文档地址在:https://docs.djangoproject.com/zh-hans/3.2/ref/settings/#sessions
SESSION_COOKIE_AGE
session 过期时间,默认为 1209600,即 14 * 24 * 60 * 60,为 14天。
我们可以在 settings.py 中配置 session 的过期时长,也可以在程序中使用方法手动配置过期时长,方法的使用我们后面再介绍。
SESSION_COOKIE_NAME
默认值为 sessionid,在用户登录之后,请求我们系统,请求的 cookie 里会带上 session key-value 的参数,这个 key 就是我们这里的 SESSION_COOKIE_NAME,默认为 sessionid。
如果想改成其他的名称直接定义即可。
SESSION_ENGING
Django 存储 session 具体数据的地方,默认值为 django.contrib.sessions.backends.db,表示存在于数据库,也就是我们前面说的在 django_session 这张表。
也可以存储在文件或者缓存里。
session 方法
这里接着介绍一下 session 相关的方法,这些方法的调用一般是在接口里通过 request.session 来操作。
这里我们只是做一下方法的作用和效果的介绍,具体用途我们在之后的示例中再详细说明。
dict 操作
我们可以将 request.session 视作一个 dict,往里面添加 user_id,is_login 等用于标识用户是否登录的信息的时候可以直接操作,比如:
request.session["user_id"] = 1
request.session["is_login"] = True
keys()
输出 request.session.keys() 返回的就是我们在前面往 session 里添加的数据。
同理,request.session.items() 输出的也是我们往里添加的数据的 key-value 的值。
del 操作
当我们使用登出操作时,可以直接使用:
del request.session["user_id"]
这种方式会删除 session 中我们保存的 user_id 信息,这样用户在访问我们的接口的时候,如果我们做登录验证的操作,就会找不到已经登录的信息。
之前我们说过,我们的 session 数据会保存在数据库里,这种方式仅仅是删除 session 中某个特定的 key-value,并不会删除 django_session 表中这条数据
而如果想要直接删除这一条 session 数据,则可以使用 flush() 方法
flush()
下面的操作则会直接操作数据库删除这条 session 数据:
request.session.flush()
flush() 和 前面的 del 方法都可以用作我们 logout 过程中的操作。
get_expiry_age()
获取 session 过期秒数,这个值就是前面我们在 settings.py 中设置的 SESSION_COOKIE_AGE 的值。
clear_expired()
从 django_session 中移除过期的会话,下面会介绍 Session 这个 model 的相关操作,这里提前说一下这个函数。
django_session 会有一个 expire_date 字段,clear_expired() 这个操作就会删除表里 expire_date 小于当前时间的数据。
3、users 模块的准备
前面介绍了 session 的相关配置和方法以及 session 的基本使用流程。接下来我们将介绍如何在系统中使用上 session。
在介绍 session 使用前,我们自定义一个 users application 来做一下相关准备。
新建一个 application 和 相关的配置,在前面的笔记中都有介绍,这里不再做赘述,比如 app 的创建、在 settings.py 里 INSTALLED_APPS 里的定义,和 hunter/urls.py 的 patterns 里新建一条数据,指向 users/urls.py 等操作。
其中,在 hunter/urls.py 中对 users app 的 url 前缀我们定义为 users,如下:
# hunter/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
path('users/', include('users.urls')),
]
我们这里在 users/models.py 下新建一个 User model,然后对其进行相关的 migration 操作,使其表添加到数据库中。
# users/models.py
from django.db import models
class User(models.Model):
username = models.CharField(max_length=20, verbose_name="登录用户名",

本文详细阐述了Django中session的配置、使用流程、登录验证操作,包括用户注册、登录、登出接口,以及session表的介绍。重点讲解了如何利用session进行登录状态验证和中间件实现全局登录控制。
最低0.47元/天 解锁文章
1572

被折叠的 条评论
为什么被折叠?



