绕过SESSION_SAVE_ON_EVERY_REQUEST进行AJAX调用或更好的解决方案

时间:2011-12-29 18:15:25

标签: django session django-views django-middleware django-settings

我有一个私人网站,需要登录所有网页。当用户去编辑记录时,我不想锁定记录。我想保留其他人的记录。我设计了一个系统,使用dajax / dajaxice对django进行AJAX调用,以获取记录编辑的最新人员和日期时间。如果最近的编辑不是由当前用户进行的,则警告框会通知用户另一个人已经进行了编辑,因为他们已经打开了记录,他们应该刷新页面以获取最新版本的数据。 / p>

这一切都很好,对我们的情况非常有效。我有一个会话超时,当超时时会将用户发送到登录提示。如果用户打开页面并离开计算机,我们希望保护敏感数据。这也很有效。

我的问题是,当进行AJAX调用以检查数据的版本时,为了查看它是否已更改,它还会保存会话,因此无论页面在页面上的时间长短,会话都不会超时无人值守。

视图中是否存在绕过SESSION_SAVE_ON_EVERY_REQUEST的方式,以便只有此请求不会触发保存。我知道我可以在每个OTHER视图中手动保存会话,但这似乎是错误的。我想我可以编写检查所请求视图的中间件,如果不是这个视图,只会保存会话,但我不确定这是最好的解决方案。

有什么建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我很确定这会奏效。我将CustomeMiddleWare添加到settings.py MIDDLEWARE_CLASSES。此外,在settings.py中的每个请求上都关闭了会话保存。

class CustomMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if view_func.__module__ != "exclude.module" and view_func.__name__ != "excludeMethod":
            request.session.save()

现在的问题是使用Dajaxice,模块和名称以dajaxice_request的形式出现。现在我不知道如何获得所请求的实际方法。尝试了很多东西,但一直没能。不想破解DajaxiceRequest代码,但可能必须。

  • 解决方案:

    为这一个方法切换到jQuery ajax。创建一个新的urls.py条目以进行单次调用以获取记录的版本。这使得process_view中的view_func可用,因此我只能将会话保存在除此之外的其他视图上。呜呜!我仍在使用Dajaxice进行所有其他AJAX方法。