Django操作session报'Response' object has no attribute 'get'错误
Django Session访问计数器/destroy路由报错修复方案
报错根因
触发AttributeError: 'Response' object has no attribute 'get'的直接原因是视图文件错误导入了Flask框架的依赖:
views.py中写了from flask import session,redirect,其中Flask的redirect方法覆盖了从django.shortcuts导入的Django原生redirect- 访问
/destroy路由时,视图返回的是Flask框架的Response对象,不符合Django中间件的处理规范,clickjacking中间件读取X-Frame-Options响应头时调用对象的get方法失败,抛出异常。
代码中还存在3个会导致功能异常的隐患:
- 导入了无用的
re模块 - 删除session键前未做存在性校验,未访问过根路由直接请求
/destroy会触发KeyError redirect('')的写法不规范,部分Django版本下无法正确跳转到根路由
分步修复方法
1. 重写views.py,修正导入和逻辑
删除错误的Flask导入、补全边界判断、修正重定向写法:
from django.shortcuts import redirect, render def index(request): # 读取现有计数,不存在则默认从0开始累加 request.session['counter'] = int(request.session.get('counter', 0)) + 1 return render(request, 'index.html') def destroy(request): # 先判断计数键存在再删除,避免KeyError if 'counter' in request.session: del request.session['counter'] # 正确跳转到根路由 return redirect('/')
2. (推荐优化)规范路由与模板传值
给路由添加name属性,避免硬编码路径,修改urls.py:
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('destroy', views.destroy, name='destroy'), ]
对应修改destroy视图的重定向逻辑,用路由名跳转:
def destroy(request): if 'counter' in request.session: del request.session['counter'] return redirect('index')
如果要避免依赖模板的request上下文,可以直接把计数值从视图传给模板,修改index视图:
def index(request): counter = int(request.session.get('counter', 0)) + 1 request.session['counter'] = counter return render(request, 'index.html', {'counter': counter})
模板中对应修改取值部分,不需要从request.session读取:
<p>{{ counter }} times</p>
验证结果
重启Django开发服务后:
- 访问根路由会正常展示累计访问次数,每次刷新计数+1
- 访问
/destroy路由会正常清空计数,跳转回根路由后计数从1重新开始,不会再抛出AttributeError异常
内容的提问来源于stack exchange,提问作者Sultnkh
相关产品推荐
相关产品推荐

