姜戈 2.2 |名称为 "sessionid" 的 Cookie 不会在匿名用户打开站点时创建

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

我在 Django 2.2 中使用 PostgreSQL。

我正在尝试在会话中设置购物车 ID,但无论用户是否登录,每次会话都会获得 none 值。即使我尝试以隐身模式打开网站,sessionid cookie 也不会由匿名用户创建。因此,每次它都会在用户登录或未登录的情况下创建一个新购物车。

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',
]

发生这种情况是因为将参数传递给函数以这种方式工作。 您正在修改请求的副本,但视图 returns 未修改。

最接近您的案例示例:

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"

如您所见,它没有被修改。

解决方案 Return 与您从 args 获得的请求实例(您要修改的)相同。 示例:

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