use*_*646 19 python django django-views
错误位于http://127.0.0.1:8000/fileupload/form.py
我有django的1.3版本.我已尝试指定localhost:8000,如其他人的问题所述,但这对我不起作用.我试图有一个文件上传表单,但我收到一个错误,form.py没有CSRF令牌.
form.py:
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
Run Code Online (Sandbox Code Playgroud)
views.py:
def upload_file(request):
c = {}
c.update(csrf(request))
if (not request.user.is_authenticated()) or (request.user == None):
return HttpResponseRedirect("/?error=11")
if request.method == 'POST':
form = c['UploadFileForm'] = UploadFileForm(request.POST, request.FILES, c, context_instance=RequestContext(request))
if c['UploadFileForm'].is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/success/url/')
else:
form = c['UploadFileForm'] = UploadFileForm()
return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']})
Run Code Online (Sandbox Code Playgroud)
upload.html:
{% block main_content %}
<form action="fileupload/form.py" enctype="multipart/form-data" method="POST">
{% csrf_token %}
<table>
<tr><td>Title:</td><td><input type="text" name="title" /></td></tr>
<tr><td>File:</td><td><input type="file" name="file" /></td></tr>
</table>
<input type="submit" value="Submit" class = "float_right button_input" />
</form>
{% endblock main_content %}
Run Code Online (Sandbox Code Playgroud)
我很难过,请告诉我一些尝试的事情.谢谢
Yug*_*dle 35
您需要传入RequestContextrender_to_responsecsrf_token
为此:(views.py)
from django.template import RequestContext
...
return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']}, RequestContext(request))
# Added RequestContext
Run Code Online (Sandbox Code Playgroud)
这会将csrf的标记传递给模板.
如果您使用装饰器,也可能会发生这种情况@cache_page(60 * 15)。如果您缓存包含 CSRF 令牌的表单的页面,则将仅缓存第一个用户的 CSRF 令牌。所以有时候调试起来有点困难。
来自Django 文档的更多信息
如果模板使用了csrf_token模板标记(或者 以其他方式调用get_token函数), CsrfViewMiddleware将在响应中添加 cookie 和Vary: Cookie标头。这意味着如果按照指示使用,中间件将与缓存中间件很好地配合(UpdateCacheMiddleware位于所有其他中间件之前)。
但是,如果您在各个视图上使用缓存装饰器,CSRF 中间件将无法设置 Vary 标头或 CSRF cookie,并且响应将在没有任何一个的情况下被缓存。在这种情况下,在任何需要插入 CSRF 令牌的视图上,您应该 首先使用django.views.decorators.csrf.csrf_protect()装饰器:
Run Code Online (Sandbox Code Playgroud)from django.views.decorators.cache import cache_page from django.views.decorators.csrf import csrf_protect @cache_page(60 * 15) @csrf_protect def my_view(request): ...
| 归档时间: |
|
| 查看次数: |
72730 次 |
| 最近记录: |