Django返回reverse结果报错:'str'对象无'get'属性
解决Django视图返回reverse字符串导致的AttributeError错误
问题现象
尝试通过键获取布尔值,值为True时程序正常,值为False时触发错误:AttributeError: 'str' object has no attribute 'get',从数据库取数据时也频繁遇到该问题。
核心代码
if model.check_login(request): ad = User.objects.get(UID=login_user_uid(request)) per = {"perto": False} status = per['perto'] print(f'sdf {type(status)}') print(f'sdf {status}') if per['perto'] is True: return render(request, "users/add_user.html", {}) else: return reverse('home') else: return redirect(reverse('login'))
程序输出
sdf <class 'bool'> sdf False Internal Server Error: /add_user Traceback (most recent call last): File "C:\workstation\amon_env\envo\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "C:\workstation\amon_env\envo\Lib\site-packages\django\utils\deprecation.py", line 136, in __call__ response = self.process_response(request, response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\workstation\amon_env\envo\Lib\site-packages\django\middleware\clickjacking.py", line 27, in process_response if response.get("X-Frame-Options") is not None: ^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'get'
错误截图

问题根源
Django视图要求必须返回HttpResponse对象(或其子类,如redirect()返回的HttpResponseRedirect),而reverse()函数仅返回URL路径的字符串。当视图返回字符串时,后续中间件(如点击劫持防护中间件)会尝试调用响应对象的get()方法处理响应头,但字符串类型没有该方法,因此触发AttributeError。
该问题和布尔值的获取逻辑无关,只是刚好在布尔值为False的分支中执行了错误的返回逻辑。
解决方案
将return reverse('home')替换为redirect(reverse('home')),或者更简洁的写法return redirect('home')(redirect()可以直接接受URL名称,内部会自动调用reverse()生成路径):
修改后的代码片段:
if per['perto'] is True: return render(request, "users/add_user.html", {}) else: return redirect('home') # 替换原return reverse('home')
内容的提问来源于stack exchange,提问作者Kmaangaty
相关产品推荐
相关产品推荐

