Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何跨Django站点启用身份验证,并透明地保存任何POST或GET数据?_Python_Django_Authentication_Wsgi_Middleware - Fatal编程技术网

Python 如何跨Django站点启用身份验证,并透明地保存任何POST或GET数据?

Python 如何跨Django站点启用身份验证,并透明地保存任何POST或GET数据?,python,django,authentication,wsgi,middleware,Python,Django,Authentication,Wsgi,Middleware,假设有人正在编辑一个HTML表单,并且他们的会话超时,那么Django如何在不丢失用户输入表单的内容的情况下重新验证该个人 该代码片段建议如何进行站点范围的身份验证,但我预计它将丢失字符串的GET组件(即因为request.path不包含它),并且肯定会丢失POST数据 一个人怎样才能保住岗位,度过那些不方便的暂停期呢。我发现精巧的网站倾向于聪明地处理这个问题,我希望能够在Django中做到这一点(我想其他网站也会这么做!) 如有任何想法,将不胜感激。谢谢。将onsubmit处理程序添加到所有表

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

该代码片段建议如何进行站点范围的身份验证,但我预计它将丢失字符串的GET组件(即因为request.path不包含它),并且肯定会丢失POST数据

一个人怎样才能保住岗位,度过那些不方便的暂停期呢。我发现精巧的网站倾向于聪明地处理这个问题,我希望能够在Django中做到这一点(我想其他网站也会这么做!)


如有任何想法,将不胜感激。谢谢。

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


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

它不是特定于Django的,而是特定于HTTP(无状态)的。。。如果系统在处理POST(从原始POST切换到GET)时发出重定向,并有丢失数据的风险,则应将数据存储在某个位置(db、memcached等),并使存储它们的密钥通过身份验证(或其他)过程

最简单的是Cookie,因为它不需要关心密钥。更困难但更防弹的(针对只读Cookie jars)是URL中的关键,用户被重定向到URL,并在请求之间进行连续中继(就像近十年前解决方案中的会话)


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

我有两个建议

重定向/中间件 因为您已经在使用中间件来处理登录需求,所以可以修改此中间件。或者,创建另一个在登录中间件之后调用的中间件类。这些想法交织在一起,因此修改现有想法可能更有意义

  • 如果未登录,则在中间件中捕获GET和POST数据,并将其存储在会话中
  • 如果用户已通过身份验证,请检查#1中设置的值。如果存在,请修改request.GET和request.POST以反映它们,并删除会话数据
  • 我认为这应该很有效,很多人会发现它很有用。这将是一个伟大的职位上

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

    一般来说,我不喜欢会话,但我认为对于经过身份验证的站点,您已经在使用它们,因此上面的答案可能适合您的方法

    如果没有会话,我将执行类似于Daniels answer的操作,即在中间件中捕获原始POST/GET,但我会更改重定向以包含发布的信息

    这在GETs上更容易,通常只是在登录url的重定向组件中编码的完整GETstring

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

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


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

    在查看问题和可用答案后,我建议您将“表单”和“django middlewear”替换为“wsgi”和“中间件”,以接触更多专家。这个问题与WSGI有关,而不是严格地与Django有关。