Django Rest Framework调用内部函数触发AssertionError错误求助
解决DRF视图调用子函数时的AssertionError问题
错误根源
直接调用被@api_view装饰的子函数时,传入的是DRF封装后的rest_framework.request.Request对象,但@api_view装饰器仅接收原始的django.http.HttpRequest对象(WSGI层传递的请求实例),两者类型不匹配导致断言失败。
可行解决方案
方案1:移除子函数的@api_view装饰器
api_option23和api_option45是主视图内部调用的工具函数,并非直接绑定路由的API视图,不需要@api_view处理请求解析、响应格式化等逻辑——主视图已经通过@api_view完成了这些工作。
修改api_option23.py:
# 移除@api_view装饰器 def api_option23(request, identifer, qr_code_id, qr_pks, loggeduser, actions): if request.method == "GET" or request.method == "POST": nowdate = datetime.now().strftime("%Y-%m-%d %H:%M") security_men = SecurityUser.objects.filter(name=loggeduser) if security_men: for men in security_men: username_id = men.pk sec_location = men.sec_location print(security_men, username_id, sec_location, qr_pks)
修改api_option45.py:
# 移除@api_view装饰器 def api_option45(request, identifer, qr_code_id, qr_pks, loggeduser, actions): if request.method == "GET" or request.method == "POST": nowdate = datetime.now().strftime("%Y-%m-%d %H:%M") security_men = SecurityUser.objects.filter(name=loggeduser) if security_men: for men in security_men: username_id = men.pk sec_location = men.sec_location print(security_men, username_id, sec_location)
方案2:传递原始HttpRequest实例
如果必须保留子函数的@api_view装饰器(不推荐),可以调用时传入DRF Request对象的_request属性,该属性指向原始的django.http.HttpRequest实例:
修改主视图的调用代码:
elif action ==2: api_option23(request._request, identifer, qr_code_id, qr_pks, loggeduser, actions) elif action ==3: api_option45(request._request, identifer, qr_code_id, qr_pks, loggeduser, actions)
推荐方案
优先选择方案1,子函数作为内部逻辑复用单元,无需独立API视图的装饰器,这样的设计更简洁,也能避免不必要的请求处理开销。
内容的提问来源于stack exchange,提问作者Khalid Seflan
相关产品推荐
相关产品推荐

