You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST框架无限递归问题求助:RecursionError报错排查

排查Django REST API无限递归错误

近期使用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.")

问题根源及修复方案

  1. URL配置循环引用导致无限递归
    主urls.py已通过path('', include('BingeWatcherApp.urls'))将根路径指向应用内URL配置,而应用内urls.py又添加了path('BingeWatcherApp/', include('BingeWatcherApp.urls')),这会导致Django解析URL时无限递归调用自身配置,直接触发递归深度超限错误。
    修复:删除应用内urls.py中的path('BingeWatcherApp/', include('BingeWatcherApp.urls'))行。

  2. 视图函数引用错误
    应用内urls.py中path('', views.Users, name='Users')里的views.Users是错误的——视图文件中定义的接口函数是UserAPI,Users是模型类,此错误会导致视图调用异常,进一步加剧问题。
    修复:将该行改为path('', views.UserAPI, name='Users'),确保引用正确的视图函数。

  3. 额外细节修复

    • PUT方法中if user_serializer.is_valid少了括号,应为if user_serializer.is_valid(),否则会跳过验证逻辑直接判定为True。
    • 建议使用DRF的APIView或视图集编写接口,更符合框架规范,也可避免手动处理JSON解析等重复工作。

内容的提问来源于stack exchange,提问作者Argent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:05:28