使用 HttpResponseRedirect 时 Django 会话数据丢失

问题描述 投票:0回答:1

我有两个简单的看法:

def form_view(request):
    form = MyModelForm()
    if request.method == "POST":
        form = MyModelForm(request.POST)
            if form.is_valid()
                form.save()
                uuid = uuid4()
                request.session["uuid"] = uuid.hex
                return HttpResponseRedirect(reverse("thanks"))
    return render(request, "form.jinja2", {"form": form})

# the url obtained by reverse("thanks") maps to this view
def redirect_view(request):
    if "uuid" in request.session: # this returns false in prodcution
        return render(request, "thanks.jinja2", {"uuid": request.session["uuid"]}
    return redirect("/")

代码在开发中有效,即我可以从 request.session 获取数据,但在生产中它不起作用,我似乎不明白为什么。

我尝试过设置

request.session.modified = True
,在设置中设置
SESSION_COOKIE_SECURE = False
,还尝试在两个不同的视图中使用
request.session.set_test_cookie()
request.session.test_cookie_worked()
,即在
form_view
中设置cookie并在
redirect_view
中测试cookie,但它返回错误。有趣的是,如果我这样做:

def form_view(request):
    form = MyModelForm()
    if request.method == "POST":
        print(request.session.test_cookie_worked()) # this prints True!
        form = MyModelForm(request.POST)
            if form.is_valid()
                form.save()
                uuid = uuid4()
                request.session["uuid"] = uuid.hex
                return HttpResponseRedirect(reverse("thanks"))
    request.session.set_test_cookie()
    return render(request, "form.jinja2", {"form": form})

test_cookie_worked()
返回
True

我在搜索类似内容时尝试了许多推荐的解决方案,但这些解决方案都不适合我,而且我不知道还能尝试什么。

两种环境的相关设置是:

SESSION_COOKIE_SECURE = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_COOKIE_AGE = 60 * 60
SECURE_SSL_REDIRECT = True
CSRF_COOKIE_SECURE = True
SESSION_ENGINE = 'django.contrib.sessions.backends.db'

生产环境和开发都运行在https上。

编辑:做了更多调查,似乎 django 没有接收 cookie。

python django django-sessions
1个回答
0
投票

清漆有问题。 Varnish 删除了 cookie,因此我为该网站添加了一个例外,并且它起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.