跳到主要内容

Django REST 请求与响应

介绍

在 Django REST 框架(DRF)中,请求(Request)和响应(Response)是构建 API 的核心组件。请求是客户端发送给服务器的数据,而响应是服务器返回给客户端的数据。理解这两者的工作原理对于构建高效、灵活的 API 至关重要。

本文将逐步讲解 Django REST 框架中的请求与响应机制,并通过实际案例帮助你更好地理解这些概念。

请求(Request)

在 Django REST 框架中,Request 对象是对 Django 的 HttpRequest 对象的扩展。它提供了更灵活的方式来处理传入的请求数据。

请求对象的主要属性

  • request.data: 包含解析后的请求体数据,支持 JSON、表单数据等格式。
  • request.query_params: 包含 URL 中的查询参数(类似于 Django 的 request.GET)。
  • request.method: 返回请求的 HTTP 方法(如 GETPOST 等)。
  • request.user: 返回当前认证的用户。

示例:处理 POST 请求

假设我们有一个简单的 API 视图,用于创建新的用户:

python
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class CreateUserView(APIView):
def post(self, request):
username = request.data.get('username')
email = request.data.get('email')

if not username or not email:
return Response({'error': 'Username and email are required'}, status=status.HTTP_400_BAD_REQUEST)

# 假设我们有一个创建用户的函数
user = create_user(username, email)

return Response({'id': user.id, 'username': user.username}, status=status.HTTP_201_CREATED)

在这个示例中,request.data 用于获取客户端发送的 JSON 数据。如果数据不完整,API 将返回一个错误响应。

响应(Response)

Response 对象是 Django REST 框架中用于返回 HTTP 响应的主要工具。它允许你轻松地构造 JSON 响应,并设置状态码和响应头。

响应对象的主要属性

  • Response(data, status=None, headers=None): 构造一个响应对象。
    • data: 响应的主体内容,通常是一个字典或列表。
    • status: HTTP 状态码(如 200404 等)。
    • headers: 自定义的 HTTP 头。

示例:返回 JSON 响应

继续上面的示例,我们使用 Response 对象返回新创建的用户信息:

python
return Response({'id': user.id, 'username': user.username}, status=status.HTTP_201_CREATED)

在这个示例中,Response 对象返回了一个包含用户信息的 JSON 响应,并设置了 201 Created 状态码。

实际案例:构建一个简单的 API

让我们通过一个完整的案例来展示如何使用 Django REST 框架处理请求与响应。

案例:任务管理 API

假设我们要构建一个简单的任务管理 API,允许用户创建和获取任务。

1. 定义模型

首先,我们定义一个 Task 模型:

python
from django.db import models

class Task(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
completed = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)

2. 创建序列化器

接下来,我们创建一个序列化器来处理 Task 模型的数据:

python
from rest_framework import serializers
from .models import Task

class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ['id', 'title', 'description', 'completed', 'created_at']

3. 编写视图

然后,我们编写视图来处理创建和获取任务的请求:

python
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Task
from .serializers import TaskSerializer

class TaskListCreateView(APIView):
def get(self, request):
tasks = Task.objects.all()
serializer = TaskSerializer(tasks, many=True)
return Response(serializer.data)

def post(self, request):
serializer = TaskSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

在这个视图中,get 方法用于获取所有任务,而 post 方法用于创建新任务。

4. 配置 URL

最后,我们将视图映射到 URL:

python
from django.urls import path
from .views import TaskListCreateView

urlpatterns = [
path('tasks/', TaskListCreateView.as_view(), name='task-list-create'),
]

测试 API

现在,你可以使用 curl 或 Postman 来测试这个 API。

创建任务

bash
curl -X POST -H "Content-Type: application/json" -d '{"title": "Learn Django REST", "description": "Learn how to build APIs with Django REST framework"}' http://localhost:8000/tasks/

获取任务列表

bash
curl -X GET http://localhost:8000/tasks/

总结

在本文中,我们详细介绍了 Django REST 框架中的请求与响应机制。我们通过实际案例展示了如何构建一个简单的任务管理 API,并处理创建和获取任务的请求。

理解请求与响应是构建高效 API 的基础。希望本文能帮助你更好地掌握这些概念,并在实际项目中应用它们。

附加资源

练习

  1. 扩展任务管理 API,添加更新和删除任务的功能。
  2. 尝试使用 request.query_params 实现任务过滤功能(如按完成状态过滤)。
  3. 为 API 添加认证功能,确保只有认证用户才能创建任务。

祝你学习愉快!