2016-06-08 44 views
0

在我的网站上,Cookie和会话仅用于管理部分中的身份验证。对于所有其他网址,我不想存储Cookie或运行会话中间件,因为它会在每个http请求上创建不必要的数据库读/写。在Django中为选定页面禁用会话/ Cookie

有没有一种方法可以禁用选定页面的会话中间件,而无需身份验证中间件抱怨会话中间件丢失?

回答

2

它会在每个http请求上创建一个不必要的数据库读/写。

这是不正确的。如果您尝试向其中写入内容,Django只会创建一个会话 - 直到没有创建会话时,将设置没有会话Cookie。来自documentation

默认情况下,当会话被修改时,Django只保存到会话数据库。

请注意,会话cookie仅在创建或修改会话时发送。如果SESSION_SAVE_EVERY_REQUESTTrue,则会在每个请求中发送会话cookie。

SESSION_SAVE_EVERY_REQUEST默认为False)。

因此,对于你所描述的那种事情,不会为不访问管理员的用户创建会话,也不会有数据库开销。唯一的小开销将是检查会话cookie的中间件。

+0

我看不到这种行为。我使用django-debug-toolbar在开发服务器上运行网站。无论打开哪个页面,我都会在django-debug-toolbar的SQL部分看到以下查询:'QUERY ='SELECT“auth_user”。“id”,“auth_user”。“password”,“auth_user”。“last_login “,”auth_user“,”is_superuser“,... FROM”auth_user“WHERE”auth_user“。”id“=%s' - PARAMS =('1',) '。根据你的回答,它应该只发生在管理页面上,还是我误解了一些东西? – BartoNaz

+0

仔细检查,我发现只有在管理页面中登录后,此查询才会出现,这意味着我的浏览器每次都发送cookie。所以这对其他用户来说不是问题,但我仍然想知道是否可以完全忽略某些URL或视图的Cookie? – BartoNaz

+0

您子类Django的会话中间件,并添加一些逻辑,在调用父方法之前检查URL。国际海事组织,你只是用一块(小)开销替代另一块。 – solarissmoke