【问题标题】:How can I set cookies in a Django middleware?如何在 Django 中间件中设置 cookie?
【发布时间】:2012-10-14 18:30:31
【问题描述】:

我尝试了几个版本:

def process_response(self, request, response):

    if not request.COOKIES.get('new_user', None):

        print "cookie"

        max_age = 365 * 24 * 60 * 60  # 10 years
        expires = datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age)
        response.set_cookie('new_user', expires=expires)


    return response

但它不起作用:我在每次页面请求时都会打印“cookie”,并且我的 FF 开发工具栏 cookie 列表中没有出现 cookie。我没有将任何浏览器设置为拒绝 cookie。

我目前正在使用开发服务器,并且我确实在设置中将公共和会话中间件设置为第一个。我没有设置任何 cookie 设置。

【问题讨论】:

    标签: django cookies middleware


    【解决方案1】:

    经过几个小时的搜索,我发现您必须设置max_age参数:

    response.set_cookie('ref', request.GET.get('ref', ''),
                        expires=expires.utctimetuple(), max_age=max_age)
    

    【讨论】:

      【解决方案2】:

      来自 Django docs:

      expires 应该是格式为 "Wdy, DD-Mon-YY 的字符串 HH:MM:SS GMT" 或 UTC 中的 datetime.datetime 对象。如果过期 是一个日期时间对象,会计算max_age。

      那么,试试吧:

      >> import datetime
      >>max_age = 365 * 24 * 60 * 60  # 10 years
      >>expires = datetime.datetime.now() + datetime.timedelta(seconds=max_age)
      
      # Cookie to GMT format via strftime method
      >>response.set_cookie('new_user', expires=expires.strftime("%a, %d-%b-%Y %H:%M:%S GMT"))
      

      或

      >> response.set_cookie('new_user', expires=expires.utctimetuple())
      

      我更喜欢第一种方法。

      【讨论】:

      • 我确实传递了一个日期时间对象。
      • 尝试为 max_age 参数而不是 expires 参数提供 socond 数字。
      • 我提供max_age也是一样。
      猜你喜欢
      • 2017-06-22
      • 2011-04-01
      • 1970-01-01
      • 2011-06-21
      • 2013-11-25
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多