加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

注销后Django无法删除csrftoken

发布时间:2020-12-20 13:37:19 所属栏目:Python 来源:网络整理
导读:我使用清漆作为Django应用程序的前端缓存.这一切都适用于VCL配置.我遇到的问题是,在用户注销后,csrftoken cookie不会被删除,从那时起,清漆就会有一个MISS响应而不是HIT.在这里阅读stackoverflow一些相关的问题,我有这个注销视图 def logout_view(request): r
我使用清漆作为Django应用程序的前端缓存.这一切都适用于VCL配置.我遇到的问题是,在用户注销后,csrftoken cookie不会被删除,从那时起,清漆就会有一个MISS响应而不是HIT.在这里阅读stackoverflow一些相关的问题,我有这个注销视图

def logout_view(request):
    response = render_to_response('registration/logout.html',{},context_instance=RequestContext(request))

    if request.user.is_authenticated():
        logout(request)

        if request.GET.get('next',False):
           response = HttpResponseRedirect(next)

    response.delete_cookie('sessionid')
    response.delete_cookie('csrftoken')
    return response

用户点击退出页面后的此响应标头

Response Headers
Age:0
Cache-Control:max-age=600
Connection:keep-alive
Content-Language:en
Content-Type:text/html; charset=utf-8
Date:Mon,23 Sep 2013 09:20:43 GMT
Expires:Mon,23 Sep 2013 09:30:43 GMT
P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server:nginx/1.4.1
Set-Cookie:sessionid=; expires=Thu,01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/
Set-Cookie:csrftoken=; expires=Thu,01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/
Transfer-Encoding:chunked
Vary:Cookie,Accept-Language,Host
Via:1.1 varnish
X-Cache:MISS
X-Varnish:1950616479

default.vcl表示完整性:

backend default {
    .host = "127.0.0.1";
    .port = "8000";
}

sub vcl_recv {
    set req.grace = 15s;

    if (req.http.Cookie) {
        set req.http.Cookie = regsuball(req.http.Cookie,"(^|; ) *__utm.=[^;]+;? *","1"); # removes all cookies named __utm? (utma,utmb...) - tracking thing
    }

    # unless sessionid/csrftoken is in the request,don't pass ANY cookies (referral_source,utm,etc)
    if (req.request == "GET" && (req.url ~ "^/static" || (req.http.cookie !~ "flash_sessionid" && req.http.cookie !~ "csrftoken"))) {
        remove req.http.Cookie;
    }

    # normalize accept-encoding to account for different browsers
    # see: https://www.varnish-cache.org/trac/wiki/VCLExampleNormalizeAcceptEncoding
    if (req.http.Accept-Encoding) {
        if (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
        } else {  
            # unknown algorithm  
            remove req.http.Accept-Encoding;
        }
    }
}

sub vcl_fetch {
    set beresp.ttl = 300s;
    set beresp.grace = 15s;

    # static files always cached 
    if (req.url ~ "^/static") {
       unset beresp.http.set-cookie;
       return (deliver);  
    }

    # pass through for anything with a session/csrftoken set
    if (beresp.http.set-cookie ~ "flash_sessionid" || beresp.http.set-cookie ~ "csrftoken") {
       return (hit_for_pass);
    } else {
       return (deliver);
    }
}

sub vcl_deliver {
    # Add a header to indicate a cache HIT/MISS
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
    return (deliver);
}

在响应标头上,我看到Django将cookie值设置为过去的日期,但是csrftoken cookie仍然会在下一个请求中保留.

我还尝试删除’django.middleware.csrf.CsrfViewMiddleware’中间件,但cookie仍然存在.

解决方法

您可以通过编辑vcl_fetch来解决问题,如下所示:

sub vcl_fetch {
    # pass through for anything with a session/csrftoken set
    if (beresp.http.set-cookie ~ "flash_sessionid" || beresp.http.set-cookie ~ "csrftoken" || beresp.http.set-cookie ~ "sessionid") {
       return (hit_for_pass);
    } else {
       return (deliver);
    }
}

这样你就可以检查Set-Cookie:sessionid了.

使用beresp.http.set-cookie时,Varnish只看到第一个Set-Cookie标头,所以在你的情况下,Varnish返回vcl_deliver而不是hit_for_pass.

为了进一步阅读,我建议你看看vmod_header.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读