2

每当我尝试在 Django 1.2 上使用 SWFUpload 上传文件时,都会收到 HTTP 403 错误。我确定这是一个 CSRF 错误,因为当我使用 @csrf_exempt 装饰器时工作正常。

window.onload = function {
    var settings = {
        ...
        post_params: {
            "csrfmiddlewaretoken": "{{csrf_token}}"
        },
        ...
    };

var swfu = new SWFUpload(settings);
};

我也尝试使用 SWFUpload.addPostParam() 没有成功

var swfu = new SWFUpload(settings);
swfu.addPostParam('csrfmiddlewaretoken', '{{csrf_token}}'); 

我确定我将令牌传递给模板,因为我可以在源代码中看到它。我上传到的目录是可写的。我chmod 777它。

有任何想法吗?

4

1 回答 1

0

除了 post params 中的“csrfmiddlewaretoken”,django 还希望 CSRF cookie 设置正确,否则用户将收到 404 错误。

在您的中间件中将会话令牌复制到 cookie 中,同时复制 csrftoken 即可。我按照http://blog.fogtunes.com/2009/11/howto-integrate-swfupload-with-django/的说明更新了中间件部分,如下所示:

class SWFUploadMiddleware(object):

def process_request(self, request):
    if (request.method == 'POST') and (request.path == reverse('uploads.views.manual')) :  
        if 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']   
于 2011-02-26T15:12:29.817 回答