Django项目get_combined函数reporting_date值缓存异常求助
问题解决办法
核心原因是Python函数默认参数的求值时机:默认参数是在函数定义时(也就是gunicorn启动加载模块的那一刻)计算的,而不是每次调用函数时。如果你的get_combined()函数是把datetime.date.today()直接作为参数默认值,那这个值只会在gunicorn启动时生成一次,之后一直复用。
具体修复步骤:
- 打开定义
get_combined()的文件,找到函数参数定义,把默认值改为None,然后在函数内部动态计算日期:# 错误写法(默认值只会初始化一次) def get_combined(reporting_date=datetime.date.today()): # 业务逻辑 # 正确写法(每次调用时动态计算日期) def get_combined(reporting_date=None): if reporting_date is None: reporting_date = datetime.date.today() # 后续业务逻辑 - 保存修改后,重启gunicorn一次(
sudo systemctl restart gunicorn),之后不用每天重启,刷新页面就能看到reporting_date自动更新为当日日期。
额外排查点:
如果修改后问题仍存在,检查以下情况:
- 是否给
get_combined()或者调用它的视图加了Django缓存装饰器(比如@cache_page、@cache_control),这类装饰器会缓存函数返回结果,导致日期不更新,需要移除或调整缓存时效。 - 是否用了全局变量存储
reporting_date,全局变量同样是在gunicorn启动时初始化,需要把全局变量的赋值逻辑移到函数内部每次调用时执行。
内容的提问来源于stack exchange,提问作者Vlad Adrian
相关产品推荐
相关产品推荐

