Python 如何跨Django站点启用身份验证,并透明地保存任何POST或GET数据?
假设有人正在编辑一个HTML表单,并且他们的会话超时,那么Django如何在不丢失用户输入表单的内容的情况下重新验证该个人 该代码片段建议如何进行站点范围的身份验证,但我预计它将丢失字符串的GET组件(即因为request.path不包含它),并且肯定会丢失POST数据 一个人怎样才能保住岗位,度过那些不方便的暂停期呢。我发现精巧的网站倾向于聪明地处理这个问题,我希望能够在Django中做到这一点(我想其他网站也会这么做!)Python 如何跨Django站点启用身份验证,并透明地保存任何POST或GET数据?,python,django,authentication,wsgi,middleware,Python,Django,Authentication,Wsgi,Middleware,假设有人正在编辑一个HTML表单,并且他们的会话超时,那么Django如何在不丢失用户输入表单的内容的情况下重新验证该个人 该代码片段建议如何进行站点范围的身份验证,但我预计它将丢失字符串的GET组件(即因为request.path不包含它),并且肯定会丢失POST数据 一个人怎样才能保住岗位,度过那些不方便的暂停期呢。我发现精巧的网站倾向于聪明地处理这个问题,我希望能够在Django中做到这一点(我想其他网站也会这么做!) 如有任何想法,将不胜感激。谢谢。将onsubmit处理程序添加到所有表
如有任何想法,将不胜感激。谢谢。将
onsubmit
处理程序添加到所有表单中,这些表单将通过JS检查会话并在继续之前提示用户登录。这样,在用户再次登录之前,表单提交不会真正发生
并确保您验证登录的用户在会话中保持不变。它不是特定于Django的,而是特定于HTTP(无状态)的。。。如果系统在处理POST(从原始POST切换到GET)时发出重定向,并有丢失数据的风险,则应将数据存储在某个位置(db、memcached等),并使存储它们的密钥通过身份验证(或其他)过程 最简单的是Cookie,因为它不需要关心密钥。更困难但更防弹的(针对只读Cookie jars)是URL中的关键,用户被重定向到URL,并在请求之间进行连续中继(就像近十年前解决方案中的会话)
在完成身份验证(或其他过程)后,可以通过传递的密钥(从cookie或GET request变量)从数据存储中拾取数据(和过程中断)。我有两个建议 重定向/中间件 因为您已经在使用中间件来处理登录需求,所以可以修改此中间件。或者,创建另一个在登录中间件之后调用的中间件类。这些想法交织在一起,因此修改现有想法可能更有意义
如果您已经准备好表单处理,那么这就不太实际了,但是可以创建更好的用户体验。如果异步发布,Javascript处理程序可以识别“需要登录”响应代码,然后显示请求登录的弹出对话框。完成后,用户可以重新提交表单。一般来说,我不喜欢会话,但我认为对于经过身份验证的站点,您已经在使用它们,因此上面的答案可能适合您的方法 如果没有会话,我将执行类似于Daniels answer的操作,即在中间件中捕获原始POST/GET,但我会更改重定向以包含发布的信息 这在GETs上更容易,通常只是在登录url的重定向组件中编码的完整GETstring 对于POST,您可以转换为get方法,该方法适用于较小的表单,但对于较大的表单,会使url过长,我会进行重新发布,将数据发布到可能编码的登录表单,并将其存储在单个隐藏表单中(实际上几乎类似于.net viewstate) 在django中执行此操作很棘手,因为您无法重定向,因此我将使用中间件手动调用登录视图,并从那里写入HttpResponse。 编辑 在进一步研究之后,显然django的神奇管理端已经实现了类似的东西,如
看起来是个不错的选择。我将尝试并反馈。在查看问题和可用答案后,我建议您将“表单”和“django middlewear”替换为“wsgi”和“中间件”,以接触更多专家。这个问题与WSGI有关,而不是严格地与Django有关。