Django自定义is_ajax后仍报WSGIRequest无该属性错误求助
报错原因
Django 3.1及以上版本已经移除了内置的request.is_ajax()方法,你虽然自定义了同名的独立判断函数,但调用时写成了request.is_ajax(),本质是尝试访问WSGIRequest请求对象的内置属性/方法,对象本身没有这个成员,因此抛出AttributeError。
修复方案
- 修正调用方式:不要把自定义函数作为request对象的方法调用,直接传入request参数调用独立函数即可。
首先确认自定义的is_ajax函数定义在所有调用它的视图函数之前,然后把第48行的错误写法if request.is_ajax():替换为正确写法:
你写的判断逻辑本身是正确的,标准Ajax判断逻辑就是校验请求头中if is_ajax(request):HTTP_X_REQUESTED_WITH的值是否为XMLHttpRequest,完整参考代码:# 工具函数定义放在调用位置之前 def is_ajax(request): return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' def your_target_view(request): # 正确调用自定义函数 if is_ajax(request): # 编写Ajax请求对应的返回逻辑 return JsonResponse({"code": 0, "msg": "success"}) # 普通请求的返回逻辑 return render(request, "your_page.html") - 适配补充:如果使用axios等新版前端请求库,默认不会携带
X-Requested-With请求头,会导致判断失效,需要在前端全局请求配置中添加该请求头,值设置为XMLHttpRequest即可。 - 注意:如果想保留
request.is_ajax()的调用习惯,可以通过猴子补丁给WSGIRequest类新增对应方法,但是这种方式侵入性较强,后续版本升级容易出现兼容问题,优先选择直接调用独立函数的方案。
内容的提问来源于stack exchange,提问作者deniz
相关产品推荐
相关产品推荐

