我有两个简单的看法:
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。
清漆有问题。 Varnish 删除了 cookie,因此我为该网站添加了一个例外,并且它起作用了。