一、概述
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/