如何将现有Django视图转换为适配Django REST Framework的接口视图
Django视图转DRF规范改造方案
改造步骤
- 第一步:新建序列化器替换原生Django Form
在你的应用目录下新建serializers.py文件,内容如下(字段需和你原有studentDetailsForm的字段保持一致,以下假设表单只有name字段):
from rest_framework import serializers class StudentDetailsSerializer(serializers.Serializer): name = serializers.CharField(max_length=255)
- 第二步:改造视图适配DRF规范
以下是改造成本最低的函数视图方案,同时兼容原有网页表单访问和API请求:
from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework import status from .serializers import StudentDetailsSerializer from . import forms from . import student_details_module from django.shortcuts import render from django.http import HttpResponseRedirect # 如果你需要允许未认证用户发起POST请求,加这个权限装饰器 @permission_classes([AllowAny]) @api_view(['GET', 'POST']) def student_details(request): # 兼容原有网页端访问逻辑,纯API场景可以直接删掉这部分 if request.accepted_renderer.format == 'html': submitted = False if request.method == 'POST': form = forms.studentDetailsForm(request.POST) if form.is_valid(): cd = form.cleaned_data return_message,return_code = student_details_module.show_data(cd['name']) return HttpResponseRedirect('/student_details?submitted=True') else: form = forms.studentDetailsForm() if 'submitted' in request.GET: submitted = True return render(request, 'student_details.html', {'form': form, 'submitted': submitted} ) # API逻辑,支持curl请求 if request.method == 'POST': serializer = StudentDetailsSerializer(data=request.data) if serializer.is_valid(): return_message, return_code = student_details_module.show_data(serializer.validated_data['name']) return Response( data={"message": return_message, "code": return_code}, status=status.HTTP_200_OK if return_code == 0 else status.HTTP_400_BAD_REQUEST ) return Response( data={"errors": serializer.errors}, status=status.HTTP_400_BAD_REQUEST ) # GET请求返回说明,按需调整返回内容 return Response( data={"detail": "POST请求提交name参数即可查询学生信息"}, status=status.HTTP_200_OK )
- 第三步:测试验证
路由不需要改动,直接用curl测试即可:curl -X POST -d "name=测试姓名" http://你的服务地址/student_details
内容的提问来源于stack exchange,提问作者V P
相关产品推荐
相关产品推荐

