如何在 Django 中间件中设置 cookie?

e-s*_*tis 4 django cookies middleware

我尝试了几个版本:

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
Run Code Online (Sandbox Code Playgroud)

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

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

You*_*who 5

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

response.set_cookie('ref', request.GET.get('ref', ''),
                    expires=expires.utctimetuple(), max_age=max_age)
Run Code Online (Sandbox Code Playgroud)


fel*_*ins 0

来自 Django文档

expires 应该是格式为"Wdy, DD-Mon-YY HH:MM:SS GMT" 的字符串或UTC 格式的 datetime.datetime 对象。如果expires是一个日期时间对象,则会计算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"))
Run Code Online (Sandbox Code Playgroud)

或者

>> response.set_cookie('new_user', expires=expires.utctimetuple())
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一种方法。