【Django使用】4大模块50页md文档,第4篇:Django请求与响应和cookie与session

当你考虑开发现代化、高效且可扩展的网站和Web应用时,Django是一个强大的选择。Django是一个流行的开源Python Web框架,它提供了一个坚实的基础,帮助开发者快速构建功能丰富且高度定制的Web应用
Django全套笔记地址: 请移步这里
共 10 章,31 子模块


请求与响应
学习目标
- 掌握request对象使用
- 掌握response对象使用
- 掌握Django中cookie的使用
- 掌握Django中session的使用
Session
一、Session介绍
-
session与cookie对比cookie是在浏览器端保存键值对数据,而session是在服务器端保存键值对数据- 重要敏感的数据(银行卡账号,验证码,余额等),建议存储在服务器端,不能通过cookie保存到浏览器
session的使用依赖cookie
-
Django中
session数据的保存- 生活例子

- session键值对数据保存

session数据默认保存在django项目的一张数据库表中(表名为:django_session),保存格式如下:

- 不同的用户使用各自不同的浏览器,可以认为:一个浏览器代表一个用户
- 【重要】表中一条记录,保存着一个浏览器(用户)所有的session键值对数据
- 【重要】
sessionid是什么: 浏览器标识(用户标识),代表着一个用户,通过sessionid可以找到该用户所有的session键值对数据
二、Session使用
- 开启session功能【默认已经开启】
django封装了session模块,用来简化session数据操作。请参见settings.py 配置文件中session配置:
INSTALLED_APPS = [...# 默认导入了django自带的session模块'django.contrib.sessions',]MIDDLEWARE = [...# 开启session中间件'django.contrib.sessions.middleware.SessionMiddleware',]
-
生成django项目默认的数据库表
session数据默认保存在django项目的一张数据库表中(表名为:django_session)- 在保存session数据库前,需要先生成django项目默认的数据库表
- 如何生成: 打开终端,并进入到项目根目录下,再执行以下2个命令生成数据库表:
python manage.py makemigrationspython manage.py migrate -
session数据操作
request.session属性:类型为 django.contrib.sessions.backends.db.SessionStore
- 保存session数据(键值对)
request.session['键']=值
- 读取session数据
request.session.get('键', 默认值)
- 删除命令
# 删除一个sessoin键值对(注意:键不存在会报错 `KeyError`)del request.session['键']# 清除当前访问用户所有的session数据
request.session.flush() # 删除一条表记录
request.session.clear() # 清空字段中的session键值对数据
- 设置session数据有效时间; 如果不设置,默认过期时间为两周
request.session.set_expiry(value)
* 如果value是一个整数,则 session数据 将在value秒没有活动后过期* 如果value为0,则 session数据 将在用户 **关闭浏览器时过期*** 如果value为None,则 session数据 将在 **2周后过期**
三、案例
-
需求:
- 使用session保存 登录用户名 和 验证码:
- 访问
http://127.0.0.1:8000/set_session界面时,保存session数据 - 访问
http://127.0.0.1:8000/get_session界面时,读取session数据
-
实现参考
# url配置url(r'^set_session$', views.set_session),url(r'^get_session$', views.get_session),# 视图函数def set_session(request):"""保存session键值对数据"""request.session['user_id'] = 10request.session['user_name'] = 'admin'return HttpResponse('保存session成功')def get_session(request):"""读取session键值对数据"""user_id = request.session.get('user_id')user_name = request.session.get('user_name')text = 'user_id = %s, user_name = %s' % (user_id, user_name)return HttpResponse(text)
测试:保存结果,需要作base64解码

四、保存session到redis中
使用第三方包 django-redis实现**
- 在虚拟环境下安装包
pip install django-redis==4.8.0
- 修改
settings.py文件,新增如下选项:
# django项目的缓存配置CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/1","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","PASSWORD": ""}}}# session数据缓存到Redis中SESSION_ENGINE = "django.contrib.sessions.backends.cache"SESSION_CACHE_ALIAS = "default"
- 测试: 启动Redis服务器,登录一次,再查看session是否有保存到 redis 1号数据库中
类视图
学习目标
- 掌握Django中类视图的使用
- 掌握类视图中使用装饰器
- 能够使用类视图多继承和mixin扩展类
类视图
一、类视图
- 发帖功能
# url配置urlpatterns = [url(r'^post$', views.post), # 显示发帖界面url(r'^do_post$', views.do_post), # 执行发帖操作]# 视图def post(request):"""get请求: 显示发帖界面"""return render(request, 'post.html')def do_post(request):"""post请求: 执行发帖操作"""title = request.POST.get('title')content = request.POST.get('content')return HttpResponse('发帖:title=%s, content=%s' % (title, content))
- 通过一个URL和视图同时实现登录功能的
GET和POST请求(注意:可能还有PUTDELETE等);
# url配置urlpatterns = [url(r'^post$', views.post), # 发帖功能]# 视图def post(request):"""发帖功能"""if request.method == 'GET':# get请求: 显示发帖界面return render(request, 'post.html')else:# post请求: 执行发帖操作title = request.POST.get('title')content = request.POST.get('content')return HttpResponse('发帖:title=%s, content=%s' % (title, content))
-
类视图 实现
-
以函数的方式定义的视图称为函数视图
-
在Django中还可以通过类来定义一个视图,称为类视图
-
类视图 的使用
- 定义一个类,继承Django提供的
View类
from django.views.generic import Viewclass PostView(View):def get(self, request):"""get请求: 显示发帖界面"""return render(request, 'post2.html')def post(self, request):"""post请求: 执行发帖操作"""# 代码简略return HttpResponse('执行发帖操作') - 定义一个类,继承Django提供的
-
2. 调用类视图的 as_view() 方法配置url
urlpatterns = [...# 类视图注册url(r'^post2$', views.PostView.as_view()),
]
- 类视图优点:对于函数视图代码可读性和复用性更好
二、类视图原理
@classonlymethod
def as_view(cls, **initkwargs):"""Main entry point for a request-response process."""...省略代码...def view(request, *args, **kwargs):self = cls(**initkwargs)if hasattr(self, 'get') and not hasattr(self, 'head'):self.head = self.getself.request = requestself.args = argsself.kwargs = kwargs# 调用dispatch方法,按照不同请求方式调用不同请求方法return self.dispatch(request, *args, **kwargs)...省略代码...# 返回真正的函数视图return viewdef dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs)
三、类视图使用装饰器
1. 函数视图使用装饰器
需求: 实现禁止ip黑名单访问发帖界面。 解决: 可以通过在视图函数中使用装饰器实现,如下
- 为函数视图定义一个装饰器(在设计装饰器时,基本都以函数视图作为考虑的被装饰对象)
def check_ip(view_fun):"""装饰器:禁止黑名单ip访问"""def wrapper(request, *args, **kwargs):# 在视图函数执行前做额外的操作:# 禁止ip黑名单访问IP = request.META.get('REMOTE_ADDR')if IP in ['192.168.210.160']:return HttpResponse('IP禁止访问')return view_fun(request, *args, **kwargs)return wrapper
- 给视图函数进行装饰
@check_ipdef post(request):"""GET请求: 显示发帖界面"""return render(request, 'post.html')
**或者:**也可以在URL中,通过方法调用的方式添加装饰器
urlpatterns = [...# 发帖功能url(r'^post$', check_ip(views.post))]
- 问题:代码可读性差,只看视图,不知道它添加了装饰器
2. 类视图中使用装饰器
方案一:在路由中添加
```python
urlpatterns = [...# 发帖功能url(r'^post2$', check_ip(views.PostView.as_view()))
]
**方案二:在类视图中添加**注意:**不能直接给类视图的方法添加装饰器**,需要使用**method_decorator**将其转换为适用于类视图方法的装饰器。```python# 方式二# @method_decorator(check_ip, name='get') # 为特定的请求方法添加# @method_decorator(check_ip, name='dispatch') # 为所有的请求方法添加class PostView(View):# 给所有的http方法都添加装饰器# @method_decorator(check_ip)def dispatch(self, request, *args, **kwargs):return super().dispatch(request, *args, **kwargs)# 方式一@method_decorator(check_ip)def get(self, request):"""get请求:显示发帖界面"""return render(request, 'post2.html')def post(self, request):"""post请求:执行发帖操作"""# 代码简略return HttpResponse('处理发帖操作')
**说明: 关于method_decorator装饰器作用:**为函数装饰器补充第一个self参数,以便让装饰器能应用到方法中。
3. 类视图多继承 & Mixin扩展类
使用面向对象多继承的特性,可以通过定义父类(作为扩展类),在父类中定义想要向类视图补充的方法,类视图继承这些扩展父类,便可实现代码复用。
定义的扩展父类名称通常以Mixin结尾。
举例如下:
class ListModelMixin(object):"""list扩展类"""def list(self, request, *args, **kwargs):print('查询多条数据')...class CreateModelMixin(object):"""create扩展类"""def create(self, request, *args, **kwargs):print('新增一条数据')...class DepartmentView(CreateModelMixin, ListModelMixin, View):"""同时继承两个扩展类,复用list和create方法"""def get(self, request):self.list(request)...def post(self, request):self.create(request)...class EmployeeView(CreateModelMixin, View):"""继承CreateModelMixin扩展类,复用create方法"""def post(self, request):self.create(request)...
中间件
学习目标
- 掌握Django中间件的使用
中间件
-
装饰器:不在改变原有函数的前提下,在函数调用之前或之后执行额外的操作
-
Django中间件:
- 一个轻量级、底层的插件系统,用于在视图函数调用之前或之后执行额外操作,在全局上修改Django的输入或输出;
官方文档–中间件
一、中间件使用

-
定义中间件类: 通过继承Django的
MiddlewareMixin扩展类实现:-
__init__(self, get_response=None)- 服务器启动,初始化中间件类时被调用,只执行一次
-
process_request(self, request):- 在视图执行之前调用,注意:该方法可以返回None或者response对象,如果返回response对象,则视图函数就不会再执行了
-
process_response(self, request, response):- 在视图执行之后调用,必须返回
response对象
- 在视图执行之后调用,必须返回
-
-
在
setting.py文件中的MIDDLEWARE中注册
案例:
- 定义好中间件: 在项目中新建一个
middlewares.py文件,然后在该文件中定义中间件类:
class MyMiddleware(MiddlewareMixin):def __init__(self, get_response=None):super().__init__(get_response)print('init')def process_request(self, request):print('before 视图')# 注意:可以返回None或者response对象,如果返回response对象,则视图函数就不会再执行了def process_response(self, request, response):print('after 视图')return response
- 在settings.py 文件中添加注册中间件
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',...'middlewares.MyMiddleware', # 注册中间件]
- 定义一个视图进行测试
def index(request):print('==index==')return HttpResponse('hello django')
- 执行结果
initbefore 视图==index==after 视图
注意:调试模式下 __init__ 方法会执行两次
二、MiddlewareMixin源码参考
class MiddlewareMixin(object):def __init__(self, get_response=None):self.get_response = get_responsesuper(MiddlewareMixin, self).__init__()def __call__(self, request):response = Noneif hasattr(self, 'process_request'):response = self.process_request(request)if not response:response = self.get_response(request)if hasattr(self, 'process_response'):response = self.process_response(request, response)return response
三、多个中间件的执行顺序

示例
- 再定义一个中间件类
class MyMiddleware2(MiddlewareMixin):def __init__(self, get_response=None):super().__init__(get_response)print('init 2')def process_request(self, request):print('before 视图 2')def process_response(self, request, response):print('after 视图 2')return response
- 注册
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',...'middlewares.MyMiddleware', # 注册中间件'middlewares.MyMiddleware2', ]
- 执行结果
before 视图before 视图 2==index==after 视图 2after 视图
结论
- 对于视图之前执行的
process_request方法,先 注册的中间件先执行 - 对于视图之后执行的
process_response方法,后 注册的中间件先执行
模板
未完待续 下一期下一章
全套笔记直接地址: 请移步这里
相关文章:
【Django使用】4大模块50页md文档,第4篇:Django请求与响应和cookie与session
当你考虑开发现代化、高效且可扩展的网站和Web应用时,Django是一个强大的选择。Django是一个流行的开源Python Web框架,它提供了一个坚实的基础,帮助开发者快速构建功能丰富且高度定制的Web应用 Django全套笔记地址: 请移步这里 …...
uniapp - 开关按钮
目录 1.运行代码如下: 2.运行效果 3.switch属性 1.运行代码如下: <template><view class"switchBox"><switch change"switchChange" color"#F21177" :checked"form.checked" /></view&…...
使用sql语句获取SQL server库里所有表的表名,注释,行数
select * from (SELECT t.name,schema_id, SCHEMA_NAME(schema_id).t.name AS 表名, c.value AS 注释 FROM sys.tables AS t LEFT JOIN sys.extended_properties AS c ON c.major_id t.object_id AND c.minor_id 0 AND c.name MS_Description ) ss left j…...
D-Wave推出新开源及解决无线信道解码新方案!
(图片来源:网络) 加拿大量子计算机公司D-Wave(纽约证券交易所股票代码:QBTS)是量子计算系统、软件和服务领域的佼佼者,也是全球首家商业量子计算机供应商。 近期,该公司发布了一…...
JavaScrip获取视频第一帧作为封面图
在JavaScript中,你可以使用HTML5的<video>元素来加载视频,然后使用Canvas来捕获视频的第一帧作为封面图。以下是一个简单的例子: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&qu…...
MATLAB - 一些散装小技巧
散装绘图技巧 1. colorbar - TITLE显示2. 字符串换行输出3. 将信号数据矩阵转换为声音 1. colorbar - TITLE显示 h colorbar; set(get(h,Title),string,cm);2. 字符串换行输出 字符串换行输出:Cell格式 —— 用大括号,分号分割 { ‘a’ ; ’…...
【开源】基于Vue.js的衣物搭配系统的设计和实现
项目编号: S 016 ,文末获取源码。 \color{red}{项目编号:S016,文末获取源码。} 项目编号:S016,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…...
ubuntu 安装 gparted
前提环境: 阿里云的源。 sudo apt update sudo apt upgrade sudo apt install gparted 搜索:...
vue超好用的自定义指令封装
一、指令封装 目录结构: index.ts 统一注册 import { App, Directive } from "vue"; import auth from "./modules/auth"; import copy from "./modules/copy"; import waterMarker from "./modules/waterMarker"; impor…...
文件描述符与锁定状态在系统层面的表示
在 UNIX 和类 UNIX 系统中,文件描述符对应的表项(即文件描述符的内部表示)通常存储在进程的文件描述符表(File Descriptor Table)中。每个进程都有自己的文件描述符表,而文件描述符只是该表中的索引。 文件…...
C#,数值计算——插值和外推,PolCoef的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// polynomial coefficients from polynomial values /// </summary> public class PolCoef { public PolCoef() { } /// <summary>…...
单体进化微服务:拆分、注册、调用、网关、过滤、治理、分布式事务
这里写目录标题 基本介绍生产-消费-网关父依赖生产者服务消费者服务网关服务common服务 感想 基本介绍 Spring Cloud 是一个用于构建分布式系统和微服务架构的开发工具包。它提供了一系列的功能和组件,用于解决微服务架构中的常见问题,如服务注册与发现…...
介绍正则表达式及其用法
正则表达式(Regular Expression),简称为"正则",是一种用于描述、匹配、搜索文本的方式。正则表达式通常由符号和字符组成,可以用于匹配和搜索特定模式的文本。 以下是一些常用的正则表达式元字符及其用法&am…...
SpEL 表达式 是什么
SpEL(Spring Expression Language)是一种强大的表达式语言,用于在运行时查询和操作对象图。它是 Spring 框架的一部分,但也可以独立于 Spring 使用。SpEL 提供了丰富的特性集,包括对象图遍历、方法调用、算术、逻辑和关…...
gbase 8s 按时间点恢复
如果要实现8S按照时间点进行恢复,需要使用onbar进行备份和恢复,而PSM是又是onbar不可或缺的。 之前我鄙视过onpsm的健壮性,最近反复测试,发现比预想的结果好很多。 onpsm的安装手册详见:GBase 8s PSM简单配置 | GBas…...
OceanBase:OBServer节点管理
目录 1.查看节点 2.添加节点 2.1 创建数据目录 2.2.OceanBase 运行时所依赖的部分三方动态库 2.3.安装 OceanBase 数据库的 RPM 包 2.4.启动节点 observer 进程 2.5.向集群中添加节点 3.隔离节点 4.重启节点 4.1 停止服务 4.2 转储 4.3 关闭进程 4.4 启动进程 4.…...
记录一个简单的博客系统该开发过程
文章目录 1.1 设计前端页面1.2 编写数据库相关代码1.3 实现功能的前后端交互 总结 1.1 设计前端页面 首先我们的博客系统要有几个网页界面 博客列表页博客详情页登录页博客编辑页 1.2 编写数据库相关代码 本环节我们需要完成以下几个步骤. 先设计数据库(表设计), 然后编写…...
计算机毕业设计选题推荐-家庭理财微信小程序/安卓APP-项目实战
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
html实现计算器源码
文章目录 1.设计来源1.1 主界面1.2 计算效果界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134532725 html实现计算器源码,计算器源码,简易计…...
处理无线debug问题
无限debug的产生 条件说明 开发者工具是打开状态 js代码中有debugger js有定时处理 setInterval(() > {(function (a) {return (function (a) {return (Function(Function(arguments[0]" a ")()))})(a)})(bugger)(de, 0, 0, (0, 0)); }, 1000); #这里就…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
