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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:57:23