2011-10-18 79 views
3

我有睡衣和Django通过Apache2与Windows 7上的mod_wsgi运行。我不相信我从这些东西的设置中获得问题,但:唯一的事情那是行不通的是试图从睡衣生成的窗体中发布信息。试图在我的应用程序中使用睡衣生成的表单产生403s(“CSRF验证失败”错误页面)。睡衣+ Django => CSRF混淆,403错误

我已经花了数小时的时间阅读所有关于CSRF和睡衣的答案,并且做了很多关于CSRF和Django,Django和Ajax等的外部研究。如果这个问题没有解决没有人知道在这种情况下应该怎么做,我想我已经削弱了这个问题的本质。

如何将{% csrf_token %}加入睡衣生成表单中?这似乎可能是不可能的,因为从我所了解的CSRF令牌不是永久性的,睡衣生成的页面是...我的睡衣页面是从睡衣.py文件生成的,导致文件夹中充满了硬编码的东西。我如何将当前CSRF令牌整合到已经编码的表单中?

请不要犹豫,要求更多的细节,这个问题已难以置信地难以驾驭。没有发布有关整合睡衣& Django的信息。我发现的唯一解决方案似乎意识到在Django中的CSRF,说你应该只是禁用CSRF保护(我可以使用,但是我可以用什么保护来替代它?我自己的cookie系统?它是一个可怕的想法在任何情况下禁用CSRF保护?)。

谢谢!

回答

3

您需要编写一些JavaScript以从Cookie(HTTP请求的一部分)获取CSRF令牌,然后在提交时将其添加到表单中。

看看这个答案起点:Django CSRF check failing with an Ajax POST request

这里的关键是,JavaScript会为你的睡衣生成的文件为持续性,因为直到表单提交他们推迟处理令牌。

+0

好的,我知道我会在编译之前将相关的Javascript添加到.py睡衣文件中。但是你提供的链接似乎是jQuery特有的,并且作为一个对JavaScript(以及扩展的jQuery)知之甚少的人,我不确定我会如何适应jQuery独立...这听起来就像正确的解决方案一样,但是jQuery依赖于那个答案中的代码,你知道吗? – hangtwenty

+1

我自己并不是一个JavaScript高手,将jQuery放入你的页面或者至少下载非缩小版本并提取'trim'函数会更容易。这可能是一些微不足道的事情,比如从字符串的开头和结尾删除空格。你想从答案中找到的部分是'getCookie(name)'函数。然后你可以使用getCookie('csrftoken')'获取cookie数据,并将它作为一个隐藏字段添加到你的表单中(无论如何,这就是所有'{%csrf_token%}'模板)。 –

+0

好吧,那看起来就像是门票,而且我敢肯定,如果我能让Django以合理的方式提供相关的睡衣页面,但我厌倦了盗用Django的URL接口来获得睡衣甚至显示正确...太多的挫折和没有足够的文件继续这个睡衣的事情。似乎没有与Django集成时它可能很酷,但关于该集成的文档非常缺乏。我将完全切换到jQuery。谢谢你的时间! – hangtwenty