Django 响应(HttpResponse)全景手册
Django 响应(HttpResponse)全景手册
一、为什么响应对象同样重要
Web 程序 = 请求 + 响应。无论你在视图里做了多少业务逻辑,最终都要通过“响应对象”把结果塞回浏览器。Django 把所有返回细节——内容、状态码、头部——都封装进 HttpResponse
,掌握它才能优雅地“收尾”。
二、HttpResponse 的 4 个核心参数
参数 | 类型 | 说明 | 示例 |
---|---|---|---|
content |
str/bytes | 真正的响应体,浏览器最终看到的内容 | "Hello Django" |
content_type |
str | MIME 类型,告诉浏览器“我是什么” | application/json |
status |
int | HTTP 状态码,100–599 | 200 成功,404 不存在 |
headers |
dict | 自定义响应头 | {'Token': 'abc123'} |
三、最小可运行示例
from django.http import HttpResponse
def hello(request):
return HttpResponse(
content='{"msg":"ok"}',
content_type='application/json',
status=200,
headers={'X-Custom': 'django'}
)
四、状态码速查表(面试常问)
区间 | 含义 | 场景 |
---|---|---|
1xx | 信息 | 100 Continue 大文件上传 |
2xx | 成功 | 200 OK 正常返回、201 Created 新建成功 |
3xx | 重定向 | 301 永久、302 临时 |
4xx | 客户端错 | 400 参数错误、401 未登录、403 没权限、404 找不到 |
5xx | 服务端错 | 500 代码异常、502 网关错误 |
这里说一下重定向
1️⃣ 什么是重定向
服务器不直接返回页面,而是返回 “3xx 状态码 + 新地址”,让浏览器再发一次请求,完成“跳转”。
生活例子:微博 ➜ QQ 登录 ➜ 授权成功 ➜ 302 跳回微博首页。
2️⃣ Django 用法
from django.shortcuts import redirect
def login(request):
# 登录成功后跳到首页
return redirect('https://www.itcast.cn')
-
redirect(url, permanent=False)
默认 302(临时)。 -
permanent=True
返回 301(永久),SEO 专用。
3️⃣ 常见场景
场景 | 代码示例 |
---|---|
登录后跳转 | return redirect('/') |
表单提交后防刷新 | return redirect(reverse('success')) |
旧 URL 迁移 | return redirect('/new/', permanent=True) |
reverse('success')
就是把 URL 别名 翻译成 真正的 URL 字符串。redirect(reverse(‘success’)) 等价于 redirect(‘/success/’)
四 记忆口诀
“redirect 就是 302,浏览器再跑一趟。”
五、在视图中动态设置示例
def user_detail(request, user_id):
try:
user = User.objects.get(pk=user_id)
return HttpResponse(
f"用户名:{user.username}",
content_type='text/plain',
status=200
)
except User.DoesNotExist:
return HttpResponse(
"用户不存在",
content_type='text/plain',
status=404
)
六、自定义响应头
response = HttpResponse("ok")
response['X-RateLimit'] = '100'
response['Access-Control-Allow-Origin'] = '*'
return response
Postman 或浏览器 Network 面板即可看到新增头部。
七、快捷子类
-
JsonResponse(data, status=200)
—— 自动序列化字典/列表,省去手动json.dumps
。 -
FileResponse(file)
—— 流式发送文件,适合下载接口。 -
HttpResponseRedirect('/login/')
—— 302 重定向专用。
八、调试技巧
在开发阶段,任何视图都可快速打印调试:
print(request.method, request.path, response.status_code)
九、总结
“内容、类型、状态码,头部字典随你加;JsonResponse 偷懒神器,状态码 2xx 成功 4xx 用户 5xx 服务。”
- 点赞
- 收藏
- 关注作者
评论(0)