首页 > 解决方案 > Django 2.2 | 匿名用户打开站点时不会创建名称为“sessionid”的 Cookie

问题描述

我将 PostgreSQL 与 Django 2.2 一起使用。

我正在尝试在会话上设置购物车 ID,但每次会话在用户登录或不登录时都没有任何价值。即使我尝试以隐身模式打开网站 sessionid cookie 也不是由匿名用户创建的。因此,每次它创建一个用户是否登录的新购物车时。

视图.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"),
]

设置.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',
]

标签: pythondjangosessionsession-cookies

解决方案


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)

推荐阅读