Why don't cookies work properly in Django?

5.6k Views Asked by At

I have to set cookies to save cart details in my project but its not working, when i test cookies using function

request.session.set_test_cookie()

Then it set cookies but response.set_cookie function is not setting cookies. I have tried this code.

def index(request):
    if request.method == 'GET':
        response = HttpResponse('hello')
        days_expire = 7
        max_age = days_expire * 24 * 60 * 60 
        response.set_cookie('my_cookie', 'Product Cart', max_age=max_age)
        return render(request, 'home/index.py')

and for getting cookis , this code is being used

def sport(request):
    if request.method == 'GET':
        if 'my_cookie' in request.COOKIES:
            value = request.COOKIES['my_cookie']
            return HttpResponse(value)
        else:
            return HttpResponse('Cookie not set')

It always prints cookie not set string, What can be the reason behind it.

2

There are 2 best solutions below

3
On BEST ANSWER

You are creating two different HttpResponse instances: one manually and the other one is created by the render() call and returned from the view. You should save the result the of the render() call and set the cookie there:

response = render(request, 'home/index.py')
response.set_cookie('my_cookie', 'Product Cart', max_age=max_age)
return response

You should also consider:

  • Using an extenstion different from .py for your templates. They might get confused with Python code files.
  • Using sessions for your shipping card.
0
On

You must return the object as shown below otherwise cookies are not set to a browser and you can see my answer explaining how to set and get cookies in Django:

from django.shortcuts import render

def my_view(request):
    response = render(request, 'index.html', {})
    response.set_cookie('first_name', 'John')
    response.cookies['last_name'] = 'Smith'
    return response # Must return the object

In addition, Django sessions can set the session id cookies to a browser without returning the object as shown below:

from django.shortcuts import render

def my_view(request):
    response = render(request, 'index.html', {})
    request.session['first_name'] = 'John'
    request.session['last_name'] = 'Smith'
    return response # Don't need to return the object