Swagger向Django REST API发POST请求无输入选项问题求助
问题原因及解决方法
原因
你用@api_view装饰的函数视图,DRF的Swagger生成工具(drf-yasg)无法自动识别请求体需要的序列化器结构,所以Swagger界面不会显示POST请求的输入选项。类视图(如APIView)能自动推断序列化器,但函数视图需要手动标注。
解决步骤
1. 确保已安装drf-yasg
如果还没安装,先执行:
pip install drf-yasg
2. 修改视图代码,添加Swagger装饰器
在你的views.py中导入swagger_auto_schema,并给create_blog视图添加装饰器,明确指定请求体的序列化器:
from rest_framework.response import Response from rest_framework.decorators import api_view from rest_framework import status from drf_yasg.utils import swagger_auto_schema # 新增导入 from .models import Blog from .serializer import BlogSerializer @api_view(['GET']) def get_blogs(request): blogs = Blog.objects.all() serializer = BlogSerializer(blogs, many=True) return Response({ 'Blogs':serializer.data }, status.HTTP_200_OK) # 新增swagger_auto_schema装饰器,指定请求体和响应序列化器 @swagger_auto_schema( method='post', request_body=BlogSerializer, responses={status.HTTP_201_CREATED: BlogSerializer} ) @api_view(['POST']) def create_blog(request): data = request.data serializer = BlogSerializer(data=data) if serializer.is_valid(): serializer.save() return Response({ 'data':serializer.data }, status.HTTP_201_CREATED) return Response(serializer.errors)
3. 验证配置
重启Django服务,打开Swagger页面(/swagger/),找到create_blog对应的POST接口,现在应该能看到输入表单了,你可以填写字段后提交请求。
额外检查
- 确保你的
BlogSerializer正确定义了模型的字段,比如:from rest_framework import serializers from .models import Blog class BlogSerializer(serializers.ModelSerializer): class Meta: model = Blog fields = '__all__' # 或指定具体字段 - 确认
app/urls.py中已经正确配置了create_blog的路由,比如:from django.urls import path from . import views urlpatterns = [ path('blogs/', views.get_blogs, name='get-blogs'), path('blogs/create/', views.create_blog, name='create-blog'), ]
内容的提问来源于stack exchange,提问作者sai Rohit
相关产品推荐
相关产品推荐

