Bite code
Bite code

Reputation: 597113

How can I set cookies in a Django middleware?

I tried several version of this:

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

But it doesn't work: I get "cookie" printed at every page request, and no cookie is appearing in my FF dev toolbar cookie lister. I didn't set any of my browser to reject cookies.

I'm currently using the developpement server and I do have the common and session middlewares set as the first ones in settings. I don't have any cookie settings set.

Upvotes: 5

Views: 8523

Answers (2)

felipsmartins
felipsmartins

Reputation: 13549

From Django docs:

expires should either be a string in the format "Wdy, DD-Mon-YY HH:MM:SS GMT" or a datetime.datetime object in UTC. If expires is a datetime object, the max_age will be calculated.

So, try it:

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"))

or

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

I prefer the first method.

Upvotes: 0

You knows who
You knows who

Reputation: 895

After hours searching, I discovered that you have to set the max_age parameter:

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

Upvotes: 5

Related Questions