django csrf_token 不打印隐藏的输入字段
Posted
技术标签:
【中文标题】django csrf_token 不打印隐藏的输入字段【英文标题】:django csrf_token not printing hidden input field 【发布时间】:2012-03-04 02:18:40 【问题描述】:我的views.py
:
from django.core.context_processors import csrf
from django.views.decorators.csrf import csrf_protect
from django.http import *
from django.template import *
from django.shortcuts import *
# Create your views here.
@csrf_protect
def homepage(request):
return render_to_response('index.html', 'files':os.listdir('/home/username/public_html/posters') )
@csrf_protect
def upload(request):
return render_to_response('list.html', )
在我的模板index.html
:
<html>
<body>
<h1> All uploaded posters: </h1>
<form action='/posters/upload' method= 'POST'>%csrf_token%
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload">
</form>
%for file in files %
<a href = 'http://servername/~username/posters/file'>file</a> <br />
%endfor%
</body>
</html>
所以当我在浏览器中打开主页并查看源代码时,并没有 csrf 令牌!
<html>
<body>
<h1> All uploaded posters: </h1>
<form action='/posters/upload' method= 'POST'>
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload">
</form>
<a href= ......
我错过了什么?
更新:this 帮助了。
【问题讨论】:
【参考方案1】:您需要使用 RequestContext 才能使用 CSRF 中间件:
from django.template import RequestContext
# In your view:
return render_to_response('index.html'
'files':os.listdir('/home/username/public_html/posters') ,
context_instance=RequestContext(request))
顺便说一句:不建议使用csrf_protect
装饰器,因为如果您忘记使用它,就会有安全漏洞。
【讨论】:
谢谢,这让我发疯了。很高兴这很简单。【参考方案2】:一旦你使用 1.3(你应该是),render 快捷方式提供了一种更紧凑的方式:
from django.shortcuts import render
def some_view(request):
return render(request, 'template.html', context_dict)
【讨论】:
【参考方案3】:请参阅 django 文档中的 sn-p。
装饰器方法 您可以在需要保护的特定视图上使用具有完全相同功能的 csrf_protect 装饰器,而不是添加 CsrfViewMiddleware 作为全面保护。 它必须用于在输出中插入 CSRF 令牌的视图以及接受 POST 表单数据的视图。(这些通常是相同的视图函数,但并非总是如此)。它是这样使用的:
from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext
@csrf_protect
def my_view(request):
c =
# ...
return render_to_response("a_template.html", c,
context_instance=RequestContext(request))
不建议单独使用装饰器,因为如果忘记使用它,就会有安全漏洞。使用这两种方法的“腰带和大括号”策略很好,并且会产生最小的开销。
【讨论】:
以上是关于django csrf_token 不打印隐藏的输入字段的主要内容,如果未能解决你的问题,请参考以下文章
30_Django中关于使用ajax发送请求中`csrf_token`的问题和解决