【Django学习笔记 - 8】:session的配置和使用、类视图初使用

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 【Django学习笔记 - 8】:session的配置和使用、类视图初使用

一、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配置到项目中进行使用

f6300bacac95406ca32f6d916bed0317.png



3、创建子应用,使用路由分发,在views.py文件中写入设置session的代码语句。需要注意的是设置session是以键值对的形式。

760b90e40063471293975df21789ff18.png



4、在Navicat中新建一个连接

9fd5ba1b1a1d4ae88f9e2942660212f4.png



5、要将session存储于数据库中需要有表的存在,表不需要我们手动生成,可使用命令:


python manage.py migrate ,这个命令会依赖于我们的迁移文件在数据库中生成表。


267f1a4fe61a4bb9b88892813969f8ce.png



6、我们可以看到Navicat中出现自动生成了几个表

677e8fc63a1c43d586425c15c56c1046.png



7、运行项目,访问对应的路径,执行设置session的函数后再Navicat中会出现以下内容

c8110049e4314019833d9eb2f17db826.png



案例二:存储于混合型的数据库之中(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,即关闭浏览器后则消失



1de0ab65660141fcb9a10cc6ad9d4e3b.png

先设置session为会话session,再获取session的值,关闭浏览器后重新打开,再获取session,发现获取不到数据

5d39ebeb9227407eb5bc3e2349200832.png

9d4179a390eb4292aadb9895dfa240b0.png

注意:设置成会话session,即浏览器关闭之后session会自动删除;删除只会删除值,redis与数据库中的session对象并不会删除,删除的是浏览器的缓存。




3、session的删除操作


第一种:根据键名删除

del request.session[key]


第二种:request.session.clear(),将redis与mysql中的session数据清空,但是session对象依旧是存在的


第三种:request.session.flush(),将redis与mysql中的数据和对象都清空。



案例一:del演示

45ce62d5583c47509200aec9c357659b.png


步骤:先设置session-->执行删除session函数-->最后获取session-->结果对比

运行结果如下:name键已被删除


ad75b69a6c0243c7930f7d6cccacef63.png

通过redis管理工具查看键名,发现name值同时被删除

969990057c1c4079bc645befa7e5fb46.png


举例二:clear()

e2faa8802ea6482ea078847964d8dab6.png


执行结果:

再使用clear()后可以看到红框的值和以上的值不一样,即session中的键值被删除


ba7410a2f7194fb48ea616252e9bd7a5.png

在redis管理工具中的键值也被删除

6fe61013559347d8867dc7c09c868269.png




举例三:flush()


542833ee6f07414e912db712d9d61c7d.png


session后,使用flush()前:

f016ca45827e4d6a940b0056c9ce9725.png


45f3d65d3d034d61a62b6b10c9052433.png




使用flush()后session对象被删除 :

7c585439fa194dfb819baed4d1523b64.png

dc6197bdb2e94271bf179c9a5c70f925.png





二、类试图的初使用


1、类视图定义


使用类来定义的视图,称为类视图。


与函数视图的区分:

以函数的方式定义的视图称为函数视图,函数视图便于理解。


函数视图的缺点:遇到一个视图对应的路径提供了多种HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。




2、类视图的初使用


导入类试图的两种方式:


from django.views.generic import View

from django.views import View



b479ac36e4814e1e87245a14a7eb41e6.png


在子应用中设置路由,使用的是类试图的时候,指定路由的对应视图格式,as_view()相当于实例化对象

27dadc92659a45c79b0c7ca844cd4bbf.png


设置发送的请求为GET请求,获取的所设置的get请求响应

8bc89fd6d2e148c59c23d7c5efbbd467.png


要发送post请求时需要在settings.py文件中注释掉一个语句:


39399b5c3953403880eb234f6f897a7b.png


8917d9e574aa41ad9cc2f6d6a061eedf.png


总结:类视图中发起的请求是什么请求,就以请求方式的小写作为方法名来重写父类方法。


如果用户发起一个不会被处理的请求,会返回一个405的状态,表示请求方式是不允许的。



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
7天前
|
Python
Django开发——配置环境
Django开发——配置环境
|
15天前
|
JavaScript 中间件 Python
Django如何配置解决CORS问题
Django如何配置解决CORS问题
17 0
|
1月前
|
缓存 中间件 API
使用 Django 的异步特性提升 I/O 类操作的性能
使用 Django 的异步特性提升 I/O 类操作的性能
41 0
|
1月前
|
存储 安全 搜索推荐
Django中Cookie和Session的使用
Django中Cookie和Session的使用
21 0
|
3月前
|
Shell 数据库 Python
Python 教程之 Django(6)视图类型
Python 教程之 Django(6)视图类型
21 0
Python 教程之 Django(6)视图类型
|
3月前
|
XML 前端开发 JavaScript
Python 教程之 Django(5)视图基础
Python 教程之 Django(5)视图基础
28 1
Python 教程之 Django(5)视图基础
|
3月前
|
缓存 开发者 Python
Django 视图层
Django 视图层
47 0
|
4月前
|
算法 Docker Python
Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
59 0
|
4月前
|
SQL Python BI
Django实践-07日志调试,Django-Debug-Toolbar配置与sql优化
Django实践-07日志调试,Django-Debug-Toolbar配置与sql优化
Django实践-07日志调试,Django-Debug-Toolbar配置与sql优化