DRF 使用APIView编写第一个DRF API的完整教程

本教程将手把手教你用Django REST FrameworkAPIView类创建第一个RESTful API,涵盖从环境搭建到接口测试的全流程。

一、环境准备

1.1 创建Django项目

 1 # 创建项目目录
 2 mkdir myapi && cd myapi
 3 
 4 # 创建虚拟环境
 5 python -m venv venv
 6 source venv/bin/activate  # Linux/Mac
 7 venv\Scripts\activate     # Windows
 8 
 9 # 安装依赖
10 pip install django djangorestframework
11 
12 # 初始化项目
13 django startproject django-rebort

*备注:

  1、如果本地安装了django,但项目初始化时报找不到 django-admin 模块,那就更换命令为:django startproject django-rebort

  2、使用pycharm创建django项目(社区版无此功能),https://blog.csdn.net/m0_67402026/article/details/126113879

1.2 配置DRF

1 # core/settings.py
2 INSTALLED_APPS = [
3     ...
4     'rest_framework',  # 新增DRF
5 ]

 二、创建书籍管理API

2.1 定义数据模型

 1 # 创建新应用
 2 python manage.py startapp books
 3 
 4 # books/models.py
 5 from django.db import models
 6 
 7 class Book(models.Model):
 8     title = models.CharField(max_length=200)
 9     author = models.CharField(max_length=100)
10     published_date = models.DateField()
11 
12     def __str__(self):
13         return self.title

2.2 数据库迁移

1 python manage.py makemigrations
2 python manage.py migrate

三、创建序列化器

3.1 序列化器类

1 # books/serializers.py
2 from rest_framework import serializers
3 from .models import Book
4 
5 class BookSerializer(serializers.ModelSerializer):
6     class Meta:
7         model = Book
8         fields = ['id', 'title', 'author', 'published_date']

四、编写APIView视图

4.1 实现CRUD操作

 1 # books/views.py
 2 from rest_framework.views import APIView
 3 from rest_framework.response import Response
 4 from rest_framework import status
 5 from .models import Book
 6 from .serializers import BookSerializer
 7 
 8 class BookListCreateAPIView(APIView):
 9     """
10     处理GET(列表)和POST(创建)请求
11     """
12     def get(self, request):
13         books = Book.objects.all()
14         serializer = BookSerializer(books, many=True)
15         return Response(serializer.data)
16 
17     def post(self, request):
18         serializer = BookSerializer(data=request.data)
19         if serializer.is_valid():
20             serializer.save()
21             return Response(serializer.data, 
22                           status=status.HTTP_201_CREATED)
23         return Response(serializer.errors,
24                       status=status.HTTP_400_BAD_REQUEST)
25 
26 class BookDetailAPIView(APIView):
27     """
28     处理GET(详情)/PUT(更新)/DELETE(删除)
29     """
30     def get_object(self, pk):
31         try:
32             return Book.objects.get(pk=pk)
33         except Book.DoesNotExist:
34             return None
35 
36     def get(self, request, pk):
37         book = self.get_object(pk)
38         if not book:
39             return Response(status=status.HTTP_404_NOT_FOUND)
40         serializer = BookSerializer(book)
41         return Response(serializer.data)
42 
43     def put(self, request, pk):
44         book = self.get_object(pk)
45         if not book:
46             return Response(status=status.HTTP_404_NOT_FOUND)
47         
48         serializer = BookSerializer(book, data=request.data)
49         if serializer.is_valid():
50             serializer.save()
51             return Response(serializer.data)
52         return Response(serializer.errors,
53                       status=status.HTTP_400_BAD_REQUEST)
54 
55     def delete(self, request, pk):
56         book = self.get_object(pk)
57         if not book:
58             return Response(status=status.HTTP_404_NOT_FOUND)
59         book.delete()
60         return Response(status=status.HTTP_204_NO_CONTENT)

五、配置路由

5.1 URL映射

 1 # core/urls.py
 2 from django.urls import path
 3 from books import views
 4 
 5 urlpatterns = [
 6     # 书籍列表和创建
 7     path('books/', views.BookListCreateAPIView.as_view()),
 8     
 9     # 单个书籍操作
10     path('books/<int:pk>/', views.BookDetailAPIView.as_view()),
11 ]

六、测试API接口

6.1 使用Django Shell创建测试数据

1 python manage.py shell
2 >>> from books.models import Book
3 >>> Book.objects.create(title="Python编程", author="Guido", published_date="2023-01-01")

具体执行结果如下

image

 6.2 启动服务

python manage.py runserver

6.3 通过curl测试接口

# 获取书籍列表
curl http://127.0.0.1:8000/books/

# 创建新书籍
curl -X POST -H "Content-Type: application/json" \
-d '{"title":"DRF指南","author":"Tom","published_date":"2023-06-01"}' \
http://127.0.0.1:8000/books/

# 更新书籍
curl -X PUT -H "Content-Type: application/json" \
-d '{"title":"DRF高级指南"}' \
http://127.0.0.1:8000/books/2/

6.3 浏览器访问API 

访问 http://localhost:8000/books/ 即可看到Web界面

七、APIView核心机制解析

7.1 请求处理流程

​​请求接收​​:APIView 继承自Django 的View类
​​方法分发​​:通过 HTTP 方法名称(get/post/put等)自动路由
​​请求解析​​:自动将JSON/form-data转换为 Python 字典
响应渲染​​:自动将 Python 对象转换为 JSON 格式

7.2 与 Django View 的关键区别

特性Django ViewDRF APIView
请求解析 需手动处理request.POST 自动解析JSON/表单数据
响应格式 需手动返回HttpResponse 自动渲染为JSON
异常处理 需自定义错误响应 内置统一异常处理
认证/权限 需手动实现 提供装饰器配置

八、最佳实践建议

  1. ​​保持视图简洁​​:将业务逻辑移到 service 层
  2. ​​添加分页支持​​:使用 PageNumberPagination
1 from rest_framework.pagination import PageNumberPagination
2 
3 class BookListCreateAPIView(APIView):
4     def get(self, request):
5         books = Book.objects.all()
6         paginator = PageNumberPagination()
7         page = paginator.paginate_queryset(books, request)
8         serializer = BookSerializer(page, many=True)
9         return paginator.get_paginated_response(serializer.data)
  1. ​​添加版本控制​​:在 URL 或 header 中指定 API 版本
  2. 通过本教程,您已经掌握了使用 APIView 创建基础 API 的核心技能。
 
posted @ 2025-10-24 11:45  黑夜之鹰  阅读(6)  评论(0)    收藏  举报