swfupload和django的403禁止错误

1 投票
5 回答
2798 浏览
提问于 2025-04-16 21:10

我正在尝试在我的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",
                    ....
                    ....
                    ....
            });
    };

撰写回答