一、session的初步配置和使用
1、session的介绍
session 又称“会话控制",Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 web页时,如果该用户还没有会话,则web服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将终止该会话。Session对象最常见的一个用法就是存储用户的首选项。
例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。
注意:会话状态仅在支持cookie的浏览器中保留。
2、配置session的存储方式
配置settings文件:
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
存储于混合型的数据库之中,即二者皆用:
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
存储于非关系型的数据库之中:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default' ——指定缓存的默认库
案例一:session存储于mysql中
session存储于数据库中(mysql),需要在项目文件下下载pymysql文件
即 pip install pymysql
1、要在配置文件,添加mysql所需要的配置参数 ,然后使用设置其存储于关系型数据库中
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 引擎,指定数据库的引擎要使用哪一个数据库,此处即已经修改为了mysql数据库引擎 'NAME': 'dj2022', # 数据库名 'HOST': '127.0.0.1', # 数据库的访问ip 'PORT': 3306, # 数据库的使用端口 'USER': 'root', # 用户 'PASSWORD': '' # 密码 } } # 指定session存储方式 # 1.关系型数据库 --> mysql SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 仅以关系型数据库来进行session存储
2、在根目录下的__init__.py文件中,将mysql配置到项目中进行使用
3、创建子应用,使用路由分发,在views.py文件中写入设置session的代码语句。需要注意的是设置session是以键值对的形式。
4、在Navicat中新建一个连接
5、要将session存储于数据库中需要有表的存在,表不需要我们手动生成,可使用命令:
python manage.py migrate ,这个命令会依赖于我们的迁移文件在数据库中生成表。
6、我们可以看到Navicat中出现自动生成了几个表
7、运行项目,访问对应的路径,执行设置session的函数后再Navicat中会出现以下内容
案例二:存储于混合型的数据库之中(redis和mysql)
需要下载的包:pip install django-redis
以下将使用Redis Desktop Manager管理工具
注意:要存储于混合型的数据库中时需要将案例二的设置即配置mysql数据的步骤做好。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 引擎,指定数据库的引擎要使用哪一个数据库,此处即已经修改为了mysql数据库引擎 'NAME': 'dj2022', # 数据库名 'HOST': '127.0.0.1', # 数据库的访问ip 'PORT': 3306, # 数据库的使用端口 'USER': 'root', # 用户 'PASSWORD': '' # 使用自己的密码 } } CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/0", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient" } } } SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 指定存储方式为混合存储 SESSION_CACHE_ALIAS = 'default' # 指定使用的缓存库为default
然后再次执行案例一中设置session的函数,即可看到redis和mysql中都存储着session。
注意: "LOCATION": "redis://127.0.0.1:6379/0",中的最后一个0表示使用第0个库存储,如果要使用第一个库存储session则修改为: "LOCATION":
"redis://127.0.0.1:6379/1"
案例三:session的有效期设置
当设置session时如果不写session的有效期则默认有效期为两个星期
如果写了配置session有效期的语句则必须传值
配置session语句:
request.session.set_expiry(None) :表示默认为两个星期
request.session.set_expirt(0) : 表示会话session,即关闭浏览器后则消失
先设置session为会话session,再获取session的值,关闭浏览器后重新打开,再获取session,发现获取不到数据
注意:设置成会话session,即浏览器关闭之后session会自动删除;删除只会删除值,redis与数据库中的session对象并不会删除,删除的是浏览器的缓存。
3、session的删除操作
第一种:根据键名删除
del request.session[key]
第二种:request.session.clear(),将redis与mysql中的session数据清空,但是session对象依旧是存在的
第三种:request.session.flush(),将redis与mysql中的数据和对象都清空。
案例一:del演示
步骤:先设置session-->执行删除session函数-->最后获取session-->结果对比
运行结果如下:name键已被删除
通过redis管理工具查看键名,发现name值同时被删除
举例二:clear()
执行结果:
再使用clear()后可以看到红框的值和以上的值不一样,即session中的键值被删除
在redis管理工具中的键值也被删除
举例三:flush()
置session后,使用flush()前:
使用flush()后session对象被删除 :
二、类试图的初使用
1、类视图定义
使用类来定义的视图,称为类视图。
与函数视图的区分:
以函数的方式定义的视图称为函数视图,函数视图便于理解。
函数视图的缺点:遇到一个视图对应的路径提供了多种HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。
2、类视图的初使用
导入类试图的两种方式:
from django.views.generic import View
from django.views import View
在子应用中设置路由,使用的是类试图的时候,指定路由的对应视图格式,as_view()相当于实例化对象
设置发送的请求为GET请求,获取的所设置的get请求响应
要发送post请求时需要在settings.py文件中注释掉一个语句:
总结:类视图中发起的请求是什么请求,就以请求方式的小写作为方法名来重写父类方法。
如果用户发起一个不会被处理的请求,会返回一个405的状态,表示请求方式是不允许的。