Django中安全化django_language Cookie时遭遇Cookie丢失问题
我之前也遇到过类似的需求——为了满足Mozilla的安全要求,需要给django_language Cookie加上Secure和HttpOnly属性,但Django旧版本确实没有提供直接的配置项。你自定义中间件的思路是对的,但问题出在实现方式上,导致Cookie被意外移除了。
问题分析
你的代码里,先调用父类的process_response生成了正确的语言Cookie,随后又用response.set_cookie()重新设置了一遍这个Cookie。但这个操作会覆盖父类设置的所有Cookie属性(比如path、domain、samesite等默认值),如果这些属性和浏览器预期不匹配,就会导致Cookie无法被正确保存,看起来像是“消失”了。另外,你尝试用字符串'True'设置httponly和secure也是错误的——Django的Cookie对象需要布尔值True/False,字符串值不会被正确识别。
正确的自定义中间件实现
我们不需要重新创建Cookie,只需要修改父类已经生成的Cookie的属性即可:
from django.middleware.locale import LanguageCookieMiddleware from django.conf import settings import datetime class CustomLanguageCookieMiddleware(LanguageCookieMiddleware): def process_response(self, request, response): # 先让父类完成语言Cookie的正常设置 response = super().process_response(request, response) cookie_name = settings.LANGUAGE_COOKIE_NAME # 只在Cookie已经存在的情况下修改属性,避免无效操作 if cookie_name in response.cookies: # 设置Secure和HttpOnly为布尔值 response.cookies[cookie_name]['secure'] = True response.cookies[cookie_name]['httponly'] = True # 如果你需要调整有效期,也可以在这里修改 max_age = 365 * 24 * 60 * 60 # 10年 response.cookies[cookie_name]['max-age'] = max_age response.cookies[cookie_name]['expires'] = datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age) return response
关键注意点
- 保留父类的Cookie属性:父类的
process_response会自动处理Cookie的path、domain、samesite等属性,我们只修改需要的secure和httponly,避免破坏原有逻辑。 - 布尔值设置属性:必须用
True/False而不是字符串,否则浏览器可能无法识别这些安全属性。 - 条件判断Cookie存在:父类只有在用户切换语言或者当前语言和默认语言不一致时才会设置Cookie,所以要先判断Cookie存在再修改,避免无效操作。
更简洁的方案(适用于Django 4.0+)
如果你使用的是Django 4.0及以上版本,官方已经支持直接通过配置项设置语言Cookie的安全属性,完全不需要自定义中间件:
在settings.py中添加以下配置:
# 开启Secure属性 LANGUAGE_COOKIE_SECURE = True # 开启HttpOnly属性 LANGUAGE_COOKIE_HTTPONLY = True # 可选:设置Cookie有效期 LANGUAGE_COOKIE_AGE = 365 * 24 * 60 * 60
最后一步:配置中间件
如果使用自定义中间件,记得在settings.MIDDLEWARE中替换掉原来的LanguageCookieMiddleware:
MIDDLEWARE = [ # ... 其他中间件 # 替换成你的自定义中间件路径 'your_app_name.middleware.CustomLanguageCookieMiddleware', # ... 其他中间件 ]
这样修改后,django_language Cookie就会带上Secure和HttpOnly属性,同时不会消失了。
内容的提问来源于stack exchange,提问作者zypro
相关产品推荐
相关产品推荐

