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

Django表单缓存过期致提交失败,如何调整MemCached缓存配置?

解决Django缓存过期导致表单提交失败的问题

1. 先修复眼前的报错(避免None调用replace)

你遇到的'NoneType' object has no attribute 'replace'错误,是因为缓存过期后cache.get('Current_Case_NO')返回了None,直接调用replace就会报错。先给代码加非空判断,保证程序不会崩溃:

Current_Case_NO = cache.get('Current_Case_NO')
if Current_Case_NO is not None:
    number = Current_Case_NO.replace("'", "")
else:
    # 根据业务逻辑处理缓存缺失的情况:
    # 示例1:从数据库获取初始值并存回缓存
    # from your_app.models import Case  # 替换成实际的模型
    # latest_case = Case.objects.latest('id')
    # Current_Case_NO = str(latest_case.case_no)
    # cache.set('Current_Case_NO', Current_Case_NO, timeout=42000)
    # number = Current_Case_NO.replace("'", "")
    # 示例2:给临时默认值并提示用户刷新页面
    number = ""

2. 为什么修改CACHE_MIDDLEWARE_SECONDS没用?

CACHE_MIDDLEWARE_SECONDS是控制Django缓存中间件的超时时间,也就是整个页面/视图的缓存周期,和你用cache.get/set直接操作的底层缓存API无关。要控制这个键值对的缓存时间,需要从两个地方入手:

(1)检查settings.py的Memcached全局配置

确保你的缓存配置正确指向Memcached,并且设置了全局默认超时:

CACHES = {
    'default': {
        # 根据你安装的库选后端:PyMemcacheCache是新版推荐,MemcachedCache是旧版
        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
        # 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',  # Memcached默认地址和端口,确认服务在运行
        'TIMEOUT': 42000,  # 全局默认缓存超时,单位秒(42000秒=11小时40分)
    }
}

(2)手动指定单个缓存键的超时时间

找到代码中设置Current_Case_NO到缓存的地方(比如用户打开表单时初始化缓存的代码),在cache.set时明确指定timeout参数,这个值会覆盖全局默认:

# 替换成你实际设置缓存的代码,加上timeout参数
cache.set('Current_Case_NO', your_case_number_value, timeout=42000)

如果需要这个缓存键全天有效,可以设置timeout=None(Memcached本身最大缓存时间为30天,足够你的场景)。

3. 备选方案:改用Session存储(更适合单用户场景)

因为你的应用每天只有一位用户使用,把Current_Case_NO存在用户Session里比全局缓存更合适,不会出现潜在冲突,Session默认超时时间更长(默认2周):

# 存储到Session(比如用户打开表单时)
request.session['Current_Case_NO'] = your_case_number_value

# 从Session读取(替换原来的cache.get)
Current_Case_NO = request.session.get('Current_Case_NO')
if Current_Case_NO:
    number = Current_Case_NO.replace("'", "")
else:
    # 处理Session缺失的情况

如果需要调整Session超时时间,在settings.py里修改:

SESSION_COOKIE_AGE = 86400  # 单位秒,86400=1天

内容的提问来源于stack exchange,提问作者Rob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:18:31