0

我在每个页面上都有一个登录表单。如果由于 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 还是只有在没有的情况下?

4

2 回答 2

3

你应该使用你set_test_cookieprocess_response中间件,而不是process_request. test_cookie_worked总是正确的,因为您总是通过在 处填充request.session“cookie”来自己添加它process_request- 它在控件进入视图之前执行。

于 2013-02-16T16:09:54.910 回答
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;
}

工作得很好。不管怎么说,还是要谢谢你。

于 2013-02-16T16:43:08.737 回答