Search code examples
pythondjangosessionsession-cookies

Django 2.2 | Cookie with name "sessionid" is not create while anonymous user open site


I'm using PostgreSQL with Django 2.2.

I'm trying to set cart id on the session but every time session gets none value while the user login or not. Even if I tried to open website in incognito mode sessionid cookie is not create with anonymous users. Because of that every time it create a new cart where user is login or not.

views.py

def index(request):
    context = {}
    res = getCart(request)
    context.update(res)
    return render(request, 'index.html', context)

def getCart(request):
    lines = []
    order = {}
    cartQuantity = 0
    if request.session.get('cart'):
        cart = Cart.objects.get(pk=request.session.get('cart'),state='draft')
        lines = cart.cartlines_set.all()
        cartQuantity = int(cart.getQuantity)
    if not order:
        cart = Cart.objects.create(customer_id=request.user, state='draft')
        request.session['cart'] = cart.id
        lines = cart.cartlines_set.all()
        cartQuantity = int(cart.getQuantity)


    return {'lines': lines, 'cart':cart, 'cartQuantity': cartQuantity}

** url.py **

urlpatterns = [
    path('', shop, name="shop"),
]

settings.py

SESSION_SAVE_EVERY_REQUEST = True
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Custom moduels
    'cart.apps.cartConfig',
]

Solution

  • It happens because the passing args into the function works in such a way. You're modifying a copy of the request, but the view returns not modified one.

    Closest to your case example:

    request = "I'm a true request"
    def change_request(request):
        request = "I want to change request"
        return {'foo': 'bar'}
    
    change_request(request)
    

    {'foo': 'bar'}

    print(request)
    

    "I'm a true request"

    As you can see it's not modified.

    Solution Return the same request instance (that you want to modify) as you have got from args. Example:

    def view_name(request):
        payload = {
            # your data
        }
        request.session['foo'] = 'bar'
        return render(request, 'index.html', payload)