我在每个页面都有一个登录表单。如果由于cookie被禁用而登录失败,我想向用户显示一条消息,要求他们启用cookie。我创建了中间件:
class CheckCookiesEnabled(object):
def process_request(self, request):
if request.user.is_anonymous():
request.session.set_test_cookie()
return
在我的登录视图中,我检查request.session.test_cookie_worked()
并仅在登录时登录,否则我想显示该消息。
if request.session.test_cookie_worked():
request.session.delete_test_cookie()
# Log in
else:
return HttpResponse(json.dumps({'errors': "Login failed (enable cookies to login)"}), mimetype = 'application/json')
问题是,request.session.test_cookie_worked()
似乎总是如此;即使在浏览器中禁用了cookie,Django似乎也可以设置测试cookie。任何想法为什么以及如何解决这个问题?或者有更好的方法来检查浏览器是否启用了cookie?
顺便说一句:如果我在每个请求中set_test_cookie()
,Django是否总是设置一个新的cookie或仅在没有cookie的情况下?
答案 0 :(得分:3)
您应该在set_test_cookie
中间件中使用process_response
,而不是process_request
。 test_cookie_worked
始终是真的,因为您总是通过使用" Cookie"填充request.session
来自行添加它。在process_request
- 它在控件进入视图之前执行。
答案 1 :(得分:0)
使用JavaScript结束:
function cookies_enabled() {
if (navigator.cookieEnabled) {
return true;
} else if (navigator.cookieEnabled === undefined) {
document.cookie = "testcookie";
if (cookie_present("testcookie"))
return true;
}
return false;
}
工作得很好。不管怎样,谢谢。