Загрузите файлы в Django, используя Uploadify, получив HTTP-код ответа 403 - PullRequest
3 голосов
/ 12 января 2012

Я пытаюсь загрузить файлы в Django, используя Uploadify после этого урока .Я выполнил все шаги правильно.В дополнение к этому я создал модель, в которой хранится информация о загружаемых файлах.

Мой шаблон содержит это

<script type="text/javascript" src="{{ STATIC_URL }}uploadify/swfobject.js"></script>
<script type="text/javascript" src="{{ STATIC_URL }}uploadify/jquery.uploadify.v2.1.4.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $('#file_upload').uploadify({
            'uploader'  : '{{ STATIC_URL }}uploadify/uploadify.swf',
            'script'    : '{% url upload_file %}',
            'cancelImg' : '{{ STATIC_URL }}uploadify/cancel.png',
            'auto'      : true,
            'multi'     : true,
            'fileExt'   : '*.doc;*.docx;*.pdf',
            'fileDesc'  : 'Upload Docs',
            'queueID'   : 'file_upload_queue',
            'removeCompleted': false,
        });
    });
</script>

<h2 id="smallHeading"> Upload your Documents </h2>
<input id="file_upload" type="file" name="Filedata" />
<a href="javascript:$('#file_upload').uploadifyUpload();">Upload Files</a>

Мой файл url.py содержит эту строку

  url(r'^upload/$', 'userprofile.views.upload_file', name='upload_file'), 

и вид

@csrf_exempt
def upload_file(request):
    if request.method == "POST":
        upload_file = request.FILES['Filedata']
        upload_instance = Uploads.objects.create(creator = request.user, uploaded_on = datetime.datetime.now())
    upload_instance.file.save(upload_file.name,upload_file)
    upload_instance.save()

    response = HttpResponse()
    response.write("%s\r\n" % upload.name)
    return response

, а мой models.py содержит

def get_file_path(instance, filename):
    return os.path.join('userprofiles', str(instance.creator.id), filename)

class Uploads(models.Model):
    file = models.FileField(upload_to=get_file_path)
    creator = models.ForeignKey(User)
    uploaded_on = models.DateTimeField()

Но здесь ничего не происходит.Все, что я получаю, это кнопка загрузки, я выбираю файлы, но ничего не происходит.Кто-нибудь может помочь мне выяснить, что происходит?Кажется, script не увольняют.Я знаю это, потому что раньше у меня была ошибка в моих представлениях, но никакой ошибки не возникало.

Любая помощь очень ценится.

Редактировать:

Я не вижу ничего в консоли firebug, и на панели net также не отображается никакой запрос POST, кроме django debugger показывает запрос POST для загрузки файла с ответом 403.Я использовал csrf_exempt, тогда почему это должно быть forbidden?

Решение: Я наконец решил проблему.Об ошибке 403 я узнал кое-что интересное по этой ссылке .Если представление имеет декоратор csrf_exempt, и если для этого представления есть ошибка 404, то django показывает ошибку 403.

Фактическая проблема заключалась в том, что изначально моя ссылка была неправильной, поэтому, когда я ее исправил, я перестал получатьошибка 403, но я начал получать ошибку 500.Это означало, что что-то не так с точки зрения.И так как uploadufy ничего не регистрирует в firebug, мне пришлось отлаживать, переходя через строку в моем представлении.

Кажется, что объект запроса, отправленный сценарием uploadify, не завершен, и строка creator = request.user при создании объекта выдает ошибку.Кроме этой строки, приведенный выше код работает полностью.

1 Ответ

1 голос
/ 12 января 2012

Я предлагаю продолжить отладку, чтобы увидеть, заключается ли проблема в клиентских скриптах Java или в коде Django на стороне сервера.

Загрузите плагин Firebug для Firefox. Загрузите свою страницу. Откройте Firebug и перейдите на вкладку «Net». Убедитесь, что все скрипты Java загружены. Затем проверьте консоль, чтобы увидеть, есть ли какие-либо ошибки JavaScript. Следующая проверка журналов Django, чтобы увидеть, поступают ли какие-либо HTTP-запросы и, возможно, содержат ошибки.

Это должно помочь вам получить больше информации, которая поможет вам решить вашу проблему. Вы всегда можете обновить свой вопрос, добавив дополнительную информацию, полученную в результате указанных выше действий.

...