【问题标题】:Bypass SESSION_SAVE_ON_EVERY_REQUEST for AJAX call, or better solution绕过 SESSION_SAVE_ON_EVERY_REQUEST 进行 AJAX 调用,或者更好的解决方案
【发布时间】:2012-01-30 02:15:00
【问题描述】:

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

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

我的问题是,当AJAX调用检查数据的版本时,看它是否改变,它也保存了会话,所以无论他们在页面上多久,会话都不会超时无人看管。

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

有什么建议吗?

提前致谢。

【问题讨论】:

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


    【解决方案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 方法。

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多