swfupload和django的403禁止错误
我正在尝试在我的Django应用程序中使用一个脚本来实现多个文件的上传,像swfupload或uploadify这样的工具。但是无论我怎么尝试,我总是会在上传的链接上遇到403禁止访问的错误。如果我单独运行“相同”的代码(只是链接不同的文件),那就能正常工作。
你们觉得我在主代码中遗漏了什么,还是说有我不知道的设置呢?
5 个回答
0
这可能和一个叫做Flash Cookie Bug的问题有关:你的客户端有一个身份验证的cookie,但Flash在向服务器发送请求时没有把这个cookie带上。因为请求里没有这个身份验证的cookie,所以服务器拒绝了这个请求,返回了403错误。
5
我在我的Django项目中使用了uploadify,也遇到了403错误,这是因为Django有CSRF保护机制。所以我在views.py文件中修改了这个函数来解决这个问题。
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def ajax_flash_upload(request):
2
这和 CSRF 保护
有很大关系。在我的情况下,我是这样解决这个问题的:
views.py
def photo_upload(request):
if request.method == 'POST':
for field_name in request.FILES:
....
....
return HttpResponse("ok", mimetype="text/plain")
else:
return render_response(request, 'wpphotos/post/photo_upload.html', {"csrf_token": get_token(request)},context_instance=RequestContext(request))
因为 Flash 在上传时使用自己的会话,所以你需要在中间件中设置 csrf_token
的值,具体如下:
swfupload.py
from django.conf import settings
from django.core.urlresolvers import reverse
class SWFUploadMiddleware(object):
def process_request(self, request):
if (request.method == 'POST') and (request.path == reverse('project_name.module_name.views.photo_upload')) and \
request.POST.has_key(settings.SESSION_COOKIE_NAME):
request.COOKIES[settings.SESSION_COOKIE_NAME] = request.POST[settings.SESSION_COOKIE_NAME]
if request.POST.has_key('csrftoken'):
request.COOKIES['csrftoken'] = request.POST['csrftoken']
最后一步,你需要在 JavaScript 的 SWFUpload
设置中将 csrftoken
作为 POST 参数设置,具体如下:
photo_upload.html
window.onload = function() {
swfupload = new SWFUpload({
post_params: {
"csrfmiddlewaretoken": "{{csrf_token}}"
},
upload_url: "/module_name/post/photo_upload/",
flash_url: "/media/flash/swfupload.swf",
file_size_limit : "2.5 MB",
....
....
....
});
};