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
相关产品推荐
相关产品推荐

