Django REST框架无限递归问题求助:RecursionError报错排查
近期使用Django 4.0、django-cors-headers、Django REST Framework和MSSQL-Django开发REST API,完成Get/Post/Put接口开发后启动服务器触发无限递归错误,报错信息:RecursionError: maximum recursion depth exceeded while calling a Python object。以下是各文件代码片段及问题排查:
代码片段
主urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('BingeWatcherApp.urls')) ]
models.py
class Users(models.Model): UID = models.AutoField(primary_key=True) UFName = models.CharField(max_length=100) ULName = models.CharField(max_length=100) UEmail = models.CharField(max_length=100)
serializer.py
from rest_framework import serializers from BingeWatcherApp.models import Users class UserSerializer(serializers.ModelSerializer): class Meta: model=Users fields=('UID', 'UFName','ULName', 'UEmail')
应用内urls.py
urlpatterns=[ path('', views.Users, name='Users'), path('BingeWatcherApp/', include('BingeWatcherApp.urls')) ]
视图文件
def UserAPI(request, id=0): if request.method=='GET': users = Users.objects.all() user_serializer = UserSerializer(users, many=True) return JsonResponse(user_serializer.data, safe=False) elif request.method =='POST': user_data=JSONParser().parse(request) user_serializer=UserSerializer(data=user_data) if user_serializer.is_valid(): user_serializer.save() return JsonResponse("User Inserted Correctly", safe=False) return JsonResponse("Error. Please insert valid data.") elif request.method=='PUT': user_data=JSONParser().parse(request) user = Users.objects.get(UID=user_data['UID']) user_serializer=UserSerializer(user, data=user_data) if user_serializer.is_valid: user_serializer.save() return JsonResponse("Data updated successfully") return JsonResponse("Data update unsuccesfull. Try again.")
问题根源及修复方案
URL配置循环引用导致无限递归
主urls.py已通过path('', include('BingeWatcherApp.urls'))将根路径指向应用内URL配置,而应用内urls.py又添加了path('BingeWatcherApp/', include('BingeWatcherApp.urls')),这会导致Django解析URL时无限递归调用自身配置,直接触发递归深度超限错误。
修复:删除应用内urls.py中的path('BingeWatcherApp/', include('BingeWatcherApp.urls'))行。视图函数引用错误
应用内urls.py中path('', views.Users, name='Users')里的views.Users是错误的——视图文件中定义的接口函数是UserAPI,Users是模型类,此错误会导致视图调用异常,进一步加剧问题。
修复:将该行改为path('', views.UserAPI, name='Users'),确保引用正确的视图函数。额外细节修复
- PUT方法中
if user_serializer.is_valid少了括号,应为if user_serializer.is_valid(),否则会跳过验证逻辑直接判定为True。 - 建议使用DRF的
APIView或视图集编写接口,更符合框架规范,也可避免手动处理JSON解析等重复工作。
- PUT方法中
内容的提问来源于stack exchange,提问作者Argent

