Django 学习笔记(第1篇)|请求篇:理解 request 对象,前端传参、后端接收
大家好,这是我 Django 学习日记的第一篇。作为正在学习前后端分离的开发者,我发现 ** 请求(request)** 是绕不开、也最容易混淆的知识点。
这篇我就把自己学到的、用到的 request 全部整理出来,讲清楚 request 到底是什么、有哪些参数、分别怎么用,适合和我一样正在入门的同学看。
一、request 到底是什么?
简单一句话:request 是前端传给后端的所有信息的集合。
可以把它理解成一个快递包裹:
- 里面有前端发过来的数据
- 有请求方式(GET/POST/PUT/DELETE)
- 有请求头(token、设备信息)
- 有客户端 IP、请求路径等
只要前端发起请求,Django 就会把所有内容打包成一个 request 对象,自动传给视图。
不管是函数视图还是 DRF 的 APIView,第一个参数永远是 request:
python
# 函数视图 def demo_view(request): pass # DRF 类视图 class DemoView(APIView): def post(self, request): passrequest 是前后端交互的入口,也是后端开发的起点。
二、request 最常用、最核心的属性
下面这些是我做小程序时每天都在用的属性,建议直接记牢。
1. request.method —— 请求方式
作用:告诉后端,前端这次请求想干什么。
常见值:
GET:查询、获取数据(列表、详情、搜索)POST:提交、新增数据(登录、注册、上传)PUT:修改数据DELETE:删除数据
(上面是一些常用请求,并非所有请求)
示例:
python
运行
if request.method == 'GET': return Response({"msg": "查询操作"}) if request.method == 'POST': return Response({"msg": "提交操作"})2. request.data —— 接收前端 JSON 数据(最重要)
这是前后端分离、小程序开发必用的属性。
前端(小程序 /axios)传 JSON:
json
{ "phone": "13800138000", "password": "123456" }后端接收:
python
运行
phone = request.data.get('phone') password = request.data.get('password')适用场景:
- 登录、注册
- 提交表单
- 上传图片
- 所有 JSON 格式参数
注意:只有 DRF(Django REST Framework)才有 request.data。
3. request.query_params —— 接收 GET 查询参数
前端在 URL 后面带参数:
plaintext
http://127.0.0.1:8000/api/list/?page=1&size=10&keyword=茶叶 后端获取:
python
page = request.query_params.get('page') size = request.query_params.get('size') keyword = request.query_params.get('keyword')适用场景:
- 列表分页
- 筛选
- 搜索
- 查询条件
4. request.headers —— 请求头
前端在请求头里带信息,比如 token:
js
header: { 'token': 'abcd1234xyz', 'content-type': 'application/json' }后端获取:
python
运行
token = request.headers.get('token')常用场景:
- 用户登录验证
- 权限判断
- 设备标识
5. request.path —— 当前请求路径
python
运行
print(request.path) # 输出示例:/api/farmer/login/ 可以用来做日志、权限、接口判断。
6. request.META —— 客户端原始信息
最常用的是获取用户 IP:
python
运行
ip = request.META.get('REMOTE_ADDR')三、原生 Django VS DRF 的 request 区别(必看)
这是我一开始最容易搞混的地方:
原生 Django(不使用 DRF)
request.GET:获取 GET 参数request.POST:获取表单参数- 不能直接读取 JSON
DRF(前后端分离)
request.data:统一接收 JSON、表单、文件 (eg:serializer = UserSerializer(data=request.data))request.query_params:获取 URL 查询参数- 更适合小程序、Vue、React 等前端项目.
补充:给序列化器传参时,前端提交的核心数据用 data=request.data;若需传递额外参数(如请求者信息、当前用户),需用 context={"request": request},序列化器中通过 self.context.get("request") 获取。
四、最实用总结:前端怎么传,后端怎么接?
表格
| 前端传参方式 | 后端获取方式 | 典型场景 |
|---|---|---|
| GET 查询参数 | request.query_params | 列表、分页、搜索 |
| POST JSON | request.data | 登录、注册、提交 |
| 请求头 token | request.headers | 登录验证 |
| 文件上传 | request.FILES / request.data | 图片识别、上传 |
五、实战小例子:登录接口
前端(小程序):
js
wx.request({ url: 'http://127.0.0.1:8000/api/farmer/login/', method: 'POST', data: { phone: '13800138000', password: '123456' } })后端(Django DRF):
python
运行
from rest_framework.views import APIView from rest_framework.response import Response class LoginView(APIView): def post(self, request): # 从 request 中获取参数 phone = request.data.get('phone') pwd = request.data.get('password') # 简单判断 if not phone or not pwd: return Response({"msg": "手机号或密码不能为空"}, status=400) return Response({ "code": 200, "msg": "登录成功", "data": {"phone": phone} })六、本篇学习小结
- request 是前端传给后端的所有信息
- 做小程序 / 前后端分离,重点掌握:
request.method请求方式request.data接收 JSONrequest.query_params接收 GET 参数request.headers请求头
- GET 用来查,POST 用来提交
- 所有前端参数,都在 request 里面
这就是我第一篇 Django 学习日记,如有缺漏或错误,欢迎指正!!!
下一篇我会继续整理路由 urls.py 的知识点,看看请求是怎么找到对应视图的~