如何在Django REST Framework中创建自定义REST API并接入Swagger?
当然可以在Django REST Framework(DRF)中创建完全自定义的REST API,根本不需要绑定预定义模型的CRUD操作——你的临时方案其实没必要,下面是几种常用的实现方式:
一、基于函数视图的自定义API
用@api_view装饰器直接编写业务逻辑,完全脱离模型依赖。比如实现一个计算两数之和的接口:
from rest_framework.decorators import api_view from rest_framework.response import Response @api_view(['GET']) def add_numbers(request): a = int(request.query_params.get('a', 0)) b = int(request.query_params.get('b', 0)) return Response({'result': a + b})
在urls.py中配置路由:
from django.urls import path from .views import add_numbers urlpatterns = [ path('add/', add_numbers, name='add-numbers'), ]
二、基于类视图的自定义API
继承APIView可以更灵活地支持多种HTTP请求方法,适合复杂的自定义逻辑:
from rest_framework.views import APIView from rest_framework.response import Response class TaskProcessor(APIView): def post(self, request): # 自定义业务逻辑:处理任务请求,无需关联数据库模型 task_data = request.data processed_result = f"已处理任务: {task_data['name']}" return Response({'status': 'success', 'result': processed_result}) def get(self, request): # 返回自定义状态信息 return Response({'status': 'running', 'message': '任务处理器在线'})
路由配置:
path('task-processor/', TaskProcessor.as_view(), name='task-processor'),
三、让Swagger识别自定义API
如果使用drf-spectacular(DRF常用的Swagger集成库),只要给视图添加文档注释或专用装饰器,Swagger就会自动生成接口文档:
方式1:用注释定义文档
@api_view(['GET']) def add_numbers(request): """ 计算两个整数的和 --- parameters: - name: a type: integer required: true location: query - name: b type: integer required: true location: query responses: 200: description: 计算结果 schema: type: object properties: result: type: integer """ a = int(request.query_params.get('a', 0)) b = int(request.query_params.get('b', 0)) return Response({'result': a + b})
方式2:用@extend_schema装饰器(更规范)
from drf_spectacular.utils import extend_schema, OpenApiParameter @api_view(['GET']) @extend_schema( parameters=[ OpenApiParameter(name='a', type=int, required=True, description='第一个整数'), OpenApiParameter(name='b', type=int, required=True, description='第二个整数'), ], responses={200: {'type': 'object', 'properties': {'result': {'type': 'integer'}}}} ) def add_numbers(request): a = int(request.query_params.get('a', 0)) b = int(request.query_params.get('b', 0)) return Response({'result': a + b})
总结
DRF的核心是提供RESTful API的工具链,模型CRUD只是其中一个常用场景,完全可以脱离模型实现任何自定义逻辑的API。你的临时方案虽然能运行,但会引入不必要的模型和数据库操作,改用上面的方式会更简洁高效。
内容的提问来源于stack exchange,提问作者Cristian
相关产品推荐
相关产品推荐

