繁体   English   中英

swfupload 和 django 上的 403 禁止错误

[英]403 Forbidden error on swfupload and django

我正在尝试使用脚本进行多个文件上传,例如我的 django 应用程序上的 swfupload 或 uploadify,但无论我尝试什么,我总是收到上传 URL 的 403 禁止错误。 如果我尝试独立运行“相同”代码(只是指向相同文件的不同链接),它就像一个魅力。

知道我的主代码中是否遗漏了某些内容,或者是否有某种我不知道的设置?

我在我的 django 项目中使用uploadify ,也得到 403 错误,因为 django 具有 CSRF 保护。 所以我在我的views.py中更改了这个function来解决这个问题。

from django.views.decorators.csrf import csrf_exempt    
@csrf_exempt
def ajax_flash_upload(request):

这与CSRF protection完全相关。 就我而言,我解决了这个问题,

视图.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 在上传时使用自己的 session,所以您应该在中间件中设置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']

对于最后一步,您应该在csrftoken设置为 post 参数以进行SWFUpload设置,这样

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",
                    ....
                    ....
                    ....
            });
    };

只需在初始化 Uploadify 时添加一个额外的数据(在“swf”和“uploader”设置上进行更改):

$('#file_upload').uploadify({
            'formData' : { 'csrfmiddlewaretoken' : '{{csrf_token}}' },
            'swf'       : '/static/js/uploadify.swf',
            'uploader'  : '{% url upload %}',
            // Put your other options here
        });

非常感谢,brsbilgic。 我已经尝试过您的解决方案,并且它有效,顺便说一句:中间件片段应修改为:

if request.POST.has_key('csrfmiddlewaretoken'):           
    request.COOKIES['csrftoken'] = request.POST['csrfmiddlewaretoken']

这可能与flash cookie 错误有关:您的客户端有一个身份验证 cookie,flash 不包括在其对服务器的请求中。 由于该请求没有 auth cookie,因此它会被 403 拒绝。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM