4

假设某人正在编辑一个 HTML 表单,并且他们的会话超时,那么如何让 Django 重新验证该人而不丢失用户输入表单的内容?

片段Django Snippets: Require login across entire site建议如何进行站点范围的身份验证,但我希望它会丢失字符串的 GET 组件(即因为 request.path 不包含它),并且肯定会丢失 POST 数据。

如何在那些不方便的超时中保留 POST 和 GET。我发现精巧的网站倾向于智能地处理这个问题,我希望能够在 Django 中做到这一点(我想其他人也会这样做!)。

想法将不胜感激。谢谢你。

4

4 回答 4

3

我有两个建议。

重定向/中间件

由于您已经在使用中间件来处理登录要求,因此您可以修改此中间件。或者可能,创建另一个在登录中间件之后调用的中间件类。这些想法相互交织,因此修改现有想法可能更有意义。

  1. 如果未登录,则在中间件中捕获GET和POST数据,并将其存储在会话中
  2. 如果用户已通过身份验证,请检查 #1 中设置的值。如果存在,则修改 request.GET 和 request.POST 以反映它,并删除会话数据。

我认为这应该干净利落,很多人会发现它很有用。这将是djangosnippets.org上的一个很棒的帖子。

阿贾克斯技术

如果您已经准备好表单处理,这不太实用,但可以创造更好的用户体验。如果您以异步方式发布,您的 Javascript 处理程序可以识别“需要登录”响应代码,然后显示一个弹出对话框请求登录。完成后,用户可以重新提交表单。

于 2009-02-25T02:23:22.947 回答
2

onsubmit处理程序添加到所有将通过 JS 检查会话并在继续之前提示使用登录的表单。这种方式在用户再次登录之前不会真正发生表单提交。

并确保您验证登录用户在会话中保持不变。

于 2009-02-24T22:33:18.430 回答
2

它不完全是 Django 特定的,而是 HTTP(无状态)特定的......如果系统在处理 POST(从原始 POST 切换到 GET)时发出 Redirect 并冒丢失数据的风险,应该将数据存储在某个地方(db,memcached等)并通过身份验证(或其他)过程进行存储它们的密钥。

最简单的是 Cookie,因为它需要对密钥零关心。更困难但更防弹(针对只读 Cookie jars)是 URL 用户被重定向到以及从请求到请求的连续中继的关键(就像近十年前解决方案中的 SESSION)。

完成身份验证(或其他进程)后,可以通过传递的密钥(从 Cookie 或从 GET 请求变量)从数据存储中获取数据(和中断的进程)。

于 2009-02-24T23:35:57.390 回答
0

我一般不喜欢会话,尽管我认为您已经在使用经过身份验证的站点,因此上述答案可能适合您的方法。

如果没有会话,我会做类似于 Daniels 回答的事情,即在中间件中捕获原始 POST/GET,但我会更改重定向以包含发布的信息。

这在 GET 上更容易,通常只是在登录 url 的重定向组件中编码的完整 GET 字符串。

对于 POST,您可以转换为 get 方法,该方法适用于较小的表单,但对于会使 url 太长的较大表单,我会重新发布,将数据发布到可能编码的登录表单并将其存储在单个表单中隐藏(实际上几乎就像一个 .net 视图状态)

在 django 中执行此操作很棘手,因为您无法进行重定向,因此我将使用中间件手动调用登录视图,并从那里写入 HttpResponse。编辑在对此进行了更多研究之后,显然 django 的魔术管理端已经实现了类似的东西,正如Jerry Stratton发现的那样

看起来是个不错的选择。我会尝试并反馈。

于 2009-02-25T10:41:24.200 回答