Django REST Swagger UI无POST请求体输入表单(函数视图)
解决Django REST Swagger函数视图无请求体输入框的问题
嘿,我之前也碰到过这个一模一样的问题!核心原因是Django REST Swagger需要明确知道请求体的结构才能在UI上渲染输入区域,类视图可以通过serializer_class自动生成这些元数据,但函数视图默认没提供这个能力,所以得手动给它补上。
下面给你两种适配函数视图的解决方案:
方法一:用DRF原生的@schema装饰器
直接利用Django REST Framework自带的Schema系统,手动定义请求体的字段和类型:
首先导入需要的模块:
from rest_framework.decorators import api_view, renderer_classes, schema from rest_framework import openapi from rest_framework.renderers import JSONRenderer from django.http import JsonResponse import json
然后给你的函数视图加上@schema装饰器,明确请求体的结构:
@renderer_classes([JSONRenderer]) @api_view(['POST']) @schema( openapi.Schema( type=openapi.TYPE_OBJECT, properties={ # 替换成你实际需要的请求体字段 'username': openapi.Schema(type=openapi.TYPE_STRING, description='登录用户名'), 'password': openapi.Schema(type=openapi.TYPE_STRING, description='登录密码') }, required=['username', 'password'] # 标记必填字段 ) ) def some_method(request): body = json.loads(request.body) return JsonResponse({'status': 'ok'})
这样Swagger UI就会根据你定义的Schema,渲染出对应的JSON请求体输入框了。
方法二:改用drf-yasg(更推荐)
django-rest-swagger已经停止维护了,现在更流行的是drf-yasg,它对函数视图的支持更灵活,用@swagger_auto_schema装饰器就能轻松搞定:
先安装drf-yasg:
pip install drf-yasg
然后修改你的代码:
from rest_framework.decorators import api_view, renderer_classes from rest_framework.renderers import JSONRenderer from django.http import JsonResponse import json from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi @renderer_classes([JSONRenderer]) @api_view(['POST']) @swagger_auto_schema( request_body=openapi.Schema( type=openapi.TYPE_OBJECT, properties={ 'username': openapi.Schema(type=openapi.TYPE_STRING, description='用户名'), 'password': openapi.Schema(type=openapi.TYPE_STRING, description='密码') }, required=['username', 'password'] ) ) def some_method(request): body = json.loads(request.body) return JsonResponse({'status': 'ok'})
drf-yasg的UI更美观,功能也更全,而且还在持续维护,建议你考虑切换过去。
总结一下:不管用哪种方法,核心都是给函数视图补充请求体的Schema元数据,这样Swagger才能知道该渲染什么样的输入区域。
内容的提问来源于stack exchange,提问作者idontknoooo
相关产品推荐
相关产品推荐

