我的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有所帮助。
答案 0 :(得分:8)
您需要使用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))
BTW:不建议使用csrf_protect
装饰器,因为如果您忘记使用装饰器,则会出现安全漏洞。
答案 1 :(得分:1)
一旦你使用1.3(你应该是),render快捷方式提供了一种更紧凑的方式:
from django.shortcuts import render
def some_view(request):
return render(request, 'template.html', context_dict)
答案 2 :(得分:0)
请参阅django文档的片段。
装饰器方法 您可以在需要保护的特定视图上使用具有完全相同功能的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))
不建议使用装饰器,因为如果忘记使用装饰器,则会出现安全漏洞。使用两者的“腰带和括号”策略很好,并且会产生最小的开销。