当前位置: 首页 > news >正文

【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介绍

  1. sessioncookie对比

    1. cookie是在浏览器端保存键值对数据,而session是在服务器端保存键值对数据
    2. 重要敏感的数据(银行卡账号,验证码,余额等),建议存储在服务器端,不能通过cookie保存到浏览器
    3. session 的使用依赖 cookie
  2. Django中session数据的保存

    1. 生活例子

    session模块

    1. session键值对数据保存

    session模块

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

    session模块

    • 不同的用户使用各自不同的浏览器,可以认为:一个浏览器代表一个用户
    • 【重要】表中一条记录,保存着一个浏览器(用户)所有的session键值对数据
    • 【重要】sessionid 是什么: 浏览器标识(用户标识),代表着一个用户,通过sessionid 可以找到该用户所有的session键值对数据

二、Session使用

  1. 开启session功能【默认已经开启】

django封装了session模块,用来简化session数据操作。请参见settings.py 配置文件中session配置:

INSTALLED_APPS = [...# 默认导入了django自带的session模块'django.contrib.sessions',]MIDDLEWARE = [...# 开启session中间件'django.contrib.sessions.middleware.SessionMiddleware',]
  1. 生成django项目默认的数据库表

    1. session数据默认保存在django项目的一张数据库表中(表名为:django_session)
    2. 在保存session数据库前,需要先生成django项目默认的数据库表
    3. 如何生成: 打开终端,并进入到项目根目录下,再执行以下2个命令生成数据库表:
    python manage.py makemigrationspython manage.py migrate
    
  2. 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模块

四、保存session到redis中

使用第三方包 django-redis实现**

  1. 在虚拟环境下安装包
pip install django-redis==4.8.0
  1. 修改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"
  1. 测试: 启动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和视图同时实现登录功能的 GETPOST 请求(注意:可能还有PUT DELETE等);
  # 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中还可以通过类来定义一个视图,称为类视图

    • 类视图 的使用

      1. 定义一个类,继承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('执行发帖操作')
      

​ 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黑名单访问发帖界面。 解决: 可以通过在视图函数中使用装饰器实现,如下

  1. 为函数视图定义一个装饰器(在设计装饰器时,基本都以函数视图作为考虑的被装饰对象)
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
  1. 给视图函数进行装饰
@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的输入或输出;

官方文档–中间件

一、中间件使用

image

  1. 定义中间件类: 通过继承Django的MiddlewareMixin扩展类实现:

    • __init__(self, get_response=None)

      • 服务器启动,初始化中间件类时被调用,只执行一次
    • process_request(self, request):

      • 在视图执行之前调用,注意:该方法可以返回None或者response对象,如果返回response对象,则视图函数就不会再执行了
    • process_response(self, request, response):

      • 在视图执行之后调用,必须返回 response 对象
  2. setting.py文件中的MIDDLEWARE中注册

案例:

  1. 定义好中间件: 在项目中新建一个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
  1. 在settings.py 文件中添加注册中间件
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',...'middlewares.MyMiddleware',  # 注册中间件]
  1. 定义一个视图进行测试
def index(request):print('==index==')return HttpResponse('hello django')
  1. 执行结果
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

三、多个中间件的执行顺序

image

示例

  1. 再定义一个中间件类
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
  1. 注册
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',...'middlewares.MyMiddleware',  # 注册中间件'middlewares.MyMiddleware2',  ]
  1. 执行结果
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.运行代码如下&#xff1a; 2.运行效果 3.switch属性 1.运行代码如下&#xff1a; <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推出新开源及解决无线信道解码新方案!

​&#xff08;图片来源&#xff1a;网络&#xff09; 加拿大量子计算机公司D-Wave&#xff08;纽约证券交易所股票代码&#xff1a;QBTS&#xff09;是量子计算系统、软件和服务领域的佼佼者&#xff0c;也是全球首家商业量子计算机供应商。 近期&#xff0c;该公司发布了一…...

JavaScrip获取视频第一帧作为封面图

在JavaScript中&#xff0c;你可以使用HTML5的<video>元素来加载视频&#xff0c;然后使用Canvas来捕获视频的第一帧作为封面图。以下是一个简单的例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&qu…...

MATLAB - 一些散装小技巧

散装绘图技巧 1. colorbar - TITLE显示2. 字符串换行输出3. 将信号数据矩阵转换为声音 1. colorbar - TITLE显示 h colorbar&#xff1b; set(get(h,Title),string,cm);2. 字符串换行输出 字符串换行输出&#xff1a;Cell格式 —— 用大括号&#xff0c;分号分割 { ‘a’ ; ’…...

【开源】基于Vue.js的衣物搭配系统的设计和实现

项目编号&#xff1a; S 016 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S016&#xff0c;文末获取源码。} 项目编号&#xff1a;S016&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…...

ubuntu 安装 gparted

前提环境&#xff1a; 阿里云的源。 sudo apt update sudo apt upgrade sudo apt install gparted 搜索&#xff1a;...

vue超好用的自定义指令封装

一、指令封装 目录结构&#xff1a; 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 系统中&#xff0c;文件描述符对应的表项&#xff08;即文件描述符的内部表示&#xff09;通常存储在进程的文件描述符表&#xff08;File Descriptor Table&#xff09;中。每个进程都有自己的文件描述符表&#xff0c;而文件描述符只是该表中的索引。 文件…...

C#,数值计算——插值和外推,PolCoef的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// polynomial coefficients from polynomial values /// </summary> public class PolCoef { public PolCoef() { } /// <summary>…...

单体进化微服务:拆分、注册、调用、网关、过滤、治理、分布式事务

这里写目录标题 基本介绍生产-消费-网关父依赖生产者服务消费者服务网关服务common服务 感想 基本介绍 Spring Cloud 是一个用于构建分布式系统和微服务架构的开发工具包。它提供了一系列的功能和组件&#xff0c;用于解决微服务架构中的常见问题&#xff0c;如服务注册与发现…...

介绍正则表达式及其用法

正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;简称为"正则"&#xff0c;是一种用于描述、匹配、搜索文本的方式。正则表达式通常由符号和字符组成&#xff0c;可以用于匹配和搜索特定模式的文本。 以下是一些常用的正则表达式元字符及其用法&am…...

SpEL 表达式 是什么

SpEL&#xff08;Spring Expression Language&#xff09;是一种强大的表达式语言&#xff0c;用于在运行时查询和操作对象图。它是 Spring 框架的一部分&#xff0c;但也可以独立于 Spring 使用。SpEL 提供了丰富的特性集&#xff0c;包括对象图遍历、方法调用、算术、逻辑和关…...

gbase 8s 按时间点恢复

如果要实现8S按照时间点进行恢复&#xff0c;需要使用onbar进行备份和恢复&#xff0c;而PSM是又是onbar不可或缺的。 之前我鄙视过onpsm的健壮性&#xff0c;最近反复测试&#xff0c;发现比预想的结果好很多。 onpsm的安装手册详见&#xff1a;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-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

html实现计算器源码

文章目录 1.设计来源1.1 主界面1.2 计算效果界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134532725 html实现计算器源码&#xff0c;计算器源码&#xff0c;简易计…...

处理无线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); ​ #这里就…...

如何快速解密QQ音乐文件:qmc-decoder终极指南

如何快速解密QQ音乐文件&#xff1a;qmc-decoder终极指南 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经下载了QQ音乐文件&#xff0c;却发现只能在特定播放器里…...

第38篇:Vibe Coding时代:LangGraph + 代码静态检查实战,解决 AI 代码风格混乱和潜在 Bug 问题

第38篇:Vibe Coding时代:LangGraph + 代码静态检查实战,解决 AI 代码风格混乱和潜在 Bug 问题 一、问题场景:AI 生成代码能跑,但格式和质量很不稳定 AI 生成代码常见问题: 1. import 顺序混乱 2. 未使用变量 3. 函数太长 4. 类型标注缺失 5. 代码格式不统一 6. 潜在空值…...

Godot真实感水体渲染:从Gerstner波到着色器优化的完整指南

1. 项目概述与核心思路 如果你正在用Godot引擎捣鼓一个开放世界、海岛生存或者哪怕只是一个带水池的后院场景&#xff0c;大概率会卡在“水”这个环节上。默认的水体方案要么太“塑料”&#xff0c;要么性能开销大得吓人&#xff0c;自己从头写一个基于物理的着色器又仿佛在攀登…...

D-Compress:面向机器感知的LiDAR点云实时压缩技术

1. 项目概述在资源受限的机器人系统中&#xff0c;实时传输和处理LiDAR点云数据一直是个棘手的问题。想象一下&#xff0c;一个自主导航的机器人需要将周围环境的3D点云数据实时传输到边缘服务器进行处理&#xff0c;但受限于有限的网络带宽和计算资源&#xff0c;原始点云数据…...

事件驱动爬虫框架claw.events:构建高解耦、可扩展的数据采集系统

1. 项目概述&#xff1a;一个事件驱动的开源爬虫框架最近在折腾数据采集项目时&#xff0c;我一直在寻找一个既能处理复杂异步逻辑&#xff0c;又能保持代码结构清晰、易于维护的爬虫框架。传统的Scrapy虽然强大&#xff0c;但在处理高度动态、事件驱动的采集场景时&#xff0c…...

本土化赋能:Gitee如何重塑中国开发者的代码托管体验

在数字化转型加速的今天&#xff0c;代码托管平台已成为企业技术基础设施的重要组成部分。对于中国开发者而言&#xff0c;一个能够兼顾性能、合规与本地化支持的平台显得尤为重要。Gitee作为国内领先的代码托管服务&#xff0c;正通过其独特的本土化优势&#xff0c;为开发者提…...

AI Agent团队数字档案库:用工程化方法管理角色人格与长期记忆

1. 项目概述&#xff1a;一个为AI工程师团队设计的“数字身份档案库”最近在整理团队知识库时&#xff0c;我一直在思考一个问题&#xff1a;在一个由AI Agent组成的虚拟工程团队里&#xff0c;如何让每个“成员”保持稳定、一致且富有深度的“人格”与“记忆”&#xff1f;这不…...

【2026实测】搞定海外检测算法:英文论文降AI率避坑指南与4款工具盘点

不知道各位小伙伴发现没有&#xff0c;处理英文文章这件事要比处理中文难很多。之前我自己的英文摘要写好后满心欢喜去跑检测&#xff0c;结果你猜怎么着&#xff1f;手打的摘要部分AI率居然高达85%......我折腾了两三天时间&#xff0c;查了各种资料&#xff0c;这才算真正搞懂…...

嵌入式系统分布式处理架构演进与实践

1. 嵌入式系统中的分布式处理架构演进在当今嵌入式系统领域&#xff0c;处理器正变得越来越小型化、廉价化和密集化。这种趋势使得采用多个紧密耦合的32位处理器构建产品成为可能&#xff0c;同时也给软件架构师带来了新的挑战——如何设计能够灵活分配在多个处理器上&#xff…...

别再死记硬背公式了!用Python/MATLAB仿真带你彻底搞懂惠斯通电桥与非平衡电桥

动态仿真揭秘惠斯通电桥&#xff1a;用Python/MATLAB可视化非平衡态奥秘 电桥电路是工程测量中的经典工具&#xff0c;但传统教学中复杂的公式推导往往让学习者陷入数学迷雾。当我第一次在实验室摆弄那些可调电阻时&#xff0c;突然意识到——与其死记硬背那些平衡条件公式&…...