注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

银河军团大本营

光荣的军团,永远的丰碑 <坚持原创>

 
 
 

日志

 
 

Django在html中直接使用CSRF token  

2014-03-18 09:29:17|  分类: Django |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  上周在做一个用代码直接创建HTML的表单时,运行Django后出现“Forbidden 403”的错误,网上查了一下说是Django CSRF保护机制报的错,对于使用template的情形,只需要在HTML模板中表单的定义之后加上“{% csrf_token %}”标签即可,Django在用模板生成HTML时会自动插入类似以下形式的代码:

<input type="hidden" name="csrfmiddlewaretoken" value="q4PUgQV0QoP6fhykLMchpoIHhq34q36H"/>

  对于Ajax,Django也提供了js脚本可以解决,见“https://docs.djangoproject.com/en/dev/ref/contrib/csrf/”。

  然而,我需要通过代码来动态生成带post的表单,因此需要在代码中获取当前的CSRF token,查看了Django的源代码后,发现可以通过request来取得当前的CSRF token,如以下代码所示:

from django.middleware.csrf import get_token

def build_html_response(request):
# build head
try:
csrftoken = get_token(request)
csrftoken_input = '''<input type='hidden' name='csrfmiddlewaretoken' value='%s' />''' % csrftoken
except:
csrftoken_input = ''

  只要将csrftoken_input加入到动态构造的form定义之后就可以了,最后生成的HTML代码表单部分应该如下所示:

<form action="/test_post/" method="post" >
<input type="hidden" name="csrfmiddlewaretoken" value="q4PUgQV0QoP6fhykLMchpoIHhq34q36H"/>
<!-- others... -->
</form>

  以上这种方法后来我在google里搜索“django html csrf”,也在stackoverflow.com上找到一个三年前已解决的问题:How can I embed django csrf token straight into HTML?
  顺便说一句,网上抄来抄去的几乎都是说模板和Ajax中如何解决这个CSRF Projection的问题,却很少有说直接用代码生成HTML时如何解决,也许是大家都直接用模板了?
  评论这张
 
阅读(2699)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018