403 Запрещенная ошибка на swfupload и django - PullRequest
1 голос
/ 09 июля 2011

Я пытаюсь использовать скрипт для нескольких загрузок файлов, например swfupload или uploadify в моем приложении django, но, что бы я ни пытался, я всегда получаю 403 запрещенную ошибку для URL загрузки.Если я пытаюсь запустить «один и тот же» код (просто разные ссылки на одни и те же файлы) независимо, он работает как чудо.

Любая идея, если я что-то упустил в своем основном коде или есть какой-тонастройки, о которых я не знаю?

Ответы [ 5 ]

5 голосов
/ 09 июля 2011

Я использую uploadify в моем проекте django, также получаю ошибку 403, потому что django имеет защиту CSRF. поэтому я изменяю эту функцию в моих views.py решить эту проблему.

from django.views.decorators.csrf import csrf_exempt    
@csrf_exempt
def ajax_flash_upload(request):
2 голосов
/ 10 июля 2011

Это полностью связано с CSRF protection. В моем случае я решил эту проблему так, что

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))

Поскольку во время загрузки флэш-память использует собственный сеанс, вы должны установить значение 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 в качестве параметра записи в вашем javascript для настроек 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",
                    ....
                    ....
                    ....
            });
    };
0 голосов
/ 13 декабря 2013

Большое спасибо, brsbilgic.Я попробовал ваше решение, и оно сработало!Кстати, фрагмент промежуточного программного обеспечения должен быть изменен на:

if request.POST.has_key('csrfmiddlewaretoken'):           
    request.COOKIES['csrftoken'] = request.POST['csrfmiddlewaretoken']
0 голосов
/ 21 ноября 2012

Просто добавьте дополнительные данные при инициализации Uploadify (внесите изменения в настройки «swf» и «uploader»):

$('#file_upload').uploadify({
            'formData' : { 'csrfmiddlewaretoken' : '{{csrf_token}}' },
            'swf'       : '/static/js/uploadify.swf',
            'uploader'  : '{% url upload %}',
            // Put your other options here
        });
0 голосов
/ 09 июля 2011

Это, вероятно, связано с ошибкой флеш-куки : у вашего клиента есть куки-файл аутентификации, который флеш-память не включает в свой запрос к серверу. Поскольку запрос не имеет файла cookie для аутентификации, он отклоняется с 403.

...