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

Django系列(七)HttpRequest(请求)和HttpResponse(响应)对象

一、概述
Django 使用请求和响应对象在系统中传递状态。

当一个页面被请求时,Django 会创建一个 HttpRequest 对象,这个对象包含了请求的元数据。然后,Django 加载相应的视图,将 HttpRequest 作为视图函数的第一个参数。每个视图负责返回一个 HttpResponse 对象。

本文档解释了 django.http 模块中定义的 HttpRequest 和 HttpResponse 对象的 API。

官网地址:https://docs.djangoproject.com/zh-hans/4.2/ref/request-response/

二、请求对象
注意:在视图中不管是函数还是类方法中都会有一个HttpRequest对象request 下面这些方法都是通过request对象来访问
###   以下是属性
# request.scheme
代表请求协议的字符串(通常是 http 或 https)。# request.body
作用:直接返回请求体的原始二进制数据(bytes 类型),是最常用的读取请求体的方式。
特点:
数据以二进制形式存在,需根据实际格式(如 JSON、表单数据)手动解码(如 json.loads(request.body.decode('utf-8')))。
可多次访问(Django 内部会缓存数据),不会因为读取而 “消耗” 数据。也可以使用request.read(size). request.readline() 来读取请求体数据,详见下文
# request.method
代表请求中使用的 HTTP 方法的字符串。保证是大写字母。例如:if request.method == "GET":do_something()
elif request.method == "POST":do_something_else()# request.encoding
表示当前用于解码表单提交数据的编码的字符串# request.content_type
代表请求的 MIME 类型的字符串,从 CONTENT_TYPE 头解析。# request.content_params
CONTENT_TYPE 头中包含的键/值参数字典。# request.GET
一个类似字典的对象,包含所有给定的 HTTP GET 参数。参见下面的 QueryDict 文档。# request.POST
一个类似字典的对象,包含所有给定的 HTTP POST 参数,前提是请求包含表单数据# request.COOKIES
一个包含所有 cookies 的字典。键和值是字符串。# request.FILES
一个类似字典的对象,包含所有上传的文件。FILES 中的每个键是 <input type="file" name=""> 中的 name。FILES 中的每个值是一个 UploadedFile。
FILES 只有在请求方法是 POST,并且发布请求的 <form> 有 enctype="multipart/form-data" 的情况下,才会包含数据。否则,FILES 将是一个类似字典的空白对象。# request.headers
一个不区分大小写的类似字典的对象,提供对请求中所有 HTTP 前缀头的访问# request.session
来自 SessionMiddleware。一个可读可写的,类似字典的对象,代表当前会话。# request.user
从 AuthenticationMiddleware。AUTH_USER_MODEL 的一个实例,代表当前登录的用户。如果用户当前没有登录,user 将被设置为一个 AnonymousUser 的实例。你可以用 is_authenticated 来区分它们,比如:if request.user.is_authenticated:...  # Do something for logged-in users.
else:...  # Do something for anonymous users.### 以下是方法
# request.get_host()
按顺序返回请求的发起主机# request.get_full_path()
返回 path,也就是https://example.com/music/bands/the_beatles/?print=true 这种# request.read(size)
作用:从请求体中读取指定字节数的二进制数据(bytes 类型),若不指定 size 则读取全部剩余数据。
特点:
流式读取:类似文件的 read() 方法,读取后指针会移动,再次调用会读取剩余数据(直到读完返回空字节 b'')。
数据读取后会被 “消耗”,无法重复读取(除非手动重置指针,但 Django 不推荐)。
底层依赖 WSGI 协议的 input 流,与 request.body 共享同一数据源(先调用 read() 会导致 request.body 为空,反之亦然)。
适用场景:
处理大型请求体(如大文件上传),避免一次性加载到内存,减少内存占用。
流式解析数据(如逐段处理二进制流)。# request.readline()(方法)
作用:从请求体中读取一行数据(以 \n 为分隔符),返回二进制数据(bytes 类型)。
特点:
同样是流式读取,指针会随读取移动,读完一行后下次调用读取下一行。
适用于按行分割的文本数据(如 CSV、日志文件等)。
与 request.read() 共享数据源,读取后会影响 request.body 的可用性。
适用场景:
处理按行结构化的文本数据(如逐行解析 CSV 格式的请求体)。# request.readlines()
一次读取多行,参考request.readline()
三、响应对象
与 Django 自动创建的 HttpRequest 对象不同, HttpResponse 对象是你的责任。你写的每个视图都要负责实例化、填充和返回一个 HttpResponse 对象。

HttpResponse 类位于 django.http 模块中。

### 以下是作用
# 传入字符串
>>> from django.http import HttpResponse
>>> response = HttpResponse("Text only, please.", content_type="text/plain")但如果你想逐步添加内容,你可以将 response 当作类似文件的对象来使用:>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")### 以下是属性
# HttpResponse.content
一个代表内容的字节或者字符串,必要时由字符串编码。# HttpResponse.cookies
一个包含在响应中的 cookie 的 http.cookies.SimpleCookie 对象。# HttpResponse.headers
一个不区分大小写的、类似字典的对象,提供对响应中除了 Set-Cookie 头部之外的所有 HTTP 头部的接口。# HttpResponse.charset
表示响应将被编码的字符集的字符串。如果在 HttpResponse 实例化时没有给出,将从 content_type 中提取,如果不成功,将使用 DEFAULT_CHARSET 设置。# HttpResponse.status_code
响应的 HTTP 状态码。### 以下是方法
# HttpResponse.setdefault(header, value)
设置响应头# HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)
设置一个 cookie
max_age 应该是一个 timedelta 对象、整数秒数,或者 None (默认值)expires 应是格式为 "Wdy, DD-Mon-YY HH:MM:SS GMT" 的字符串,或者是 UTC 的 datetime.datetime 对象。如果 expires 是一个 datetime 对象,将计算 max_age。如果你想设置一个跨域的 cookie,请使用 domain。例如,domain="example.com" 将设置一个可被 www.example.com、blog.example.com 等域读取的 cookie。否则,一个 cookie 将只能被设置它的域读取。如果你想让 cookie 只在使用 https 方案进行请求时才发送给服务器,请使用 secure=True。如果你想防止客户端的 JavaScript 访问 cookie,请使用 httponly=True。####
HttpResponse还有很多子类,其中最重要的一个JsonResponse
from django.http import JsonResponse它和HttpResponse区别如下:
一、核心定位与继承关系
首先明确两者的层级:HttpResponse(基类) → JsonResponse(子类)
HttpResponse:通用响应类,可返回任意格式的响应内容(文本、HTML、二进制数据等),是 Django 中所有响应的 “基础模板”。
JsonResponse:专用响应类,仅用于返回 JSON 格式数据,是在 HttpResponse 基础上封装了 JSON 序列化和响应头配置的 “快捷工具”。二、关键区别对比(表格)
对比维度	                                HttpResponse(基类)	                                                            JsonResponse(子类)
核心用途	                      通用场景:返回 HTML、纯文本、二进制文件等任意格式	              专用场景:仅返回 JSON 格式数据(前后端分离 / API)
数据序列化	                      需手动处理:若返回 JSON,需先用 json.dumps() 序列化	              自动处理:直接传入 Python 数据(字典 / 列表),内部自动转为 JSON 字符串
响应头 Content-Type	      默认值为 text/html(需手动修改为目标格式)	                          自动设置为 application/json(前端可直接解析 JSON)
用法复杂度	                      繁琐:需手动处理 “数据格式转换 + 响应头设置”	                          简洁:一行代码即可完成 JSON 响应,无需额外配置
特殊参数支持	                  无 JSON 相关专属参数,需手动拼接	                                          支持 safe(控制是否允许列表)、json_dumps_params(JSON 序列化配置)等专属参数

参考文档:https://docs.djangoproject.com/zh-hans/4.2/ref/request-response/

http://www.hskmm.com/?act=detail&tid=16980

相关文章:

  • 工业主板:智能制造与严苛环境的坚实基石
  • 课上测试:C编程工具测试(AI)
  • 标题。
  • 虚拟机下的麒麟V10SP1与SP2进行iSCSI连接——基于MobaXterm
  • 中断的基本概念
  • AT_arc173_e [ARC173E] Rearrange and Adjacent XOR
  • 修复gradle8使用Transform第一个构建中断第二次构建失败的问题:java.io.IOException: Unable to delete directory xxxx\build
  • .NET操作Word/WPS打造专业文档 - 页面设置与打印控制完全指南
  • NORDIC蓝牙6.0新品NRF54L15多协议超低功耗高性能BLE芯片 - 动能世纪
  • 记录:git、.${index}. 滚动条
  • 使用springboot开发一个宿舍管理系统练习项目 - 实践
  • 元组
  • CF1542
  • Manim实现涟漪扩散特效
  • CRMEB标准版PHP移动订单功能深度解析:多端同步方案
  • CICD流程建设之持续测试实践指南
  • Xcode 26.0.1 (17A400) 发布 - Apple 平台 IDE
  • Tenable Nessus 10.10 (macOS, Linux, Windows) - 漏洞评估解决方案
  • CNN+MNIST - 实践
  • SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
  • 超快轻量级离线翻译服务器MTranServer在腾讯云轻量应用服务器上的全流程部署指南 - 实践
  • 微算法科技(NASDAQ: MLGO)利用高级 Blowfish 加密标准实现区块链集成信息共享
  • 专业讲解大模型登记(纯干货)
  • Docker常用命令速查
  • 离线安装docker
  • MX 练石 2025 NOIP #9
  • dockerfile
  • PostgreSQL 的索引Ooracle、Mysql索引的类型对比和说明
  • Docker打包CMake项目镜像操作步骤
  • Linux dmesg 内核日志查看工具详解