Django 1.1.1 задыхается от multipart / form-data - PullRequest
1 голос
/ 26 февраля 2010

Начальная история

Я пытаюсь осуществить загрузку файлов с помощью простой формы (я вставляю раздетую версию, но все важные части включены):

  <form method="POST" action="" enctype="multipart/form-data">
      <input type="file" name="up_file" size="50">
      <input type="hidden" name="cpk" value="{{c.pk}}">
      <input type="submit" name="btn_submit">
  </form>

Теперь серверный скрипт, работающий под wsgi, получил странные значения для поля "cpk", а request.FILES было пусто пусто request.FILES и request.POST словари, поэтому я решил переключиться на сервер разработки для отладки.

Удивительно, но отладчик ipdb зависает после ввода request.POST и request.FILES и нажатия Enter ... С другой стороны, когда я удаляю enctype = " multipart / form-data " из тега, я могу проверить как request.POST , так и request.FILES , но, конечно, request.FILES пусто тогда.

(Также версия wsgi, похоже, вылечена удалением enctype = "multipart / form-data" ...)

Обновление

Я перепробовал все комбинации Opera 10 // Firefox 3.5, enctype = "multipart / form-data" // нет multipart / form-data и dev server // mod_wsgi. В результате получается, что enctype = "multipart / form-data" разрывает показ . Итак, теперь я собираюсь проверить багтрекер Django, если это известная проблема.

Между тем, может быть, кто-то здесь может указать мне правильное направление

1 Ответ

4 голосов
/ 26 февраля 2010

Возможно, вам потребуется предоставить свой вид и код формы, так как мы с большим успехом используем загрузку форм с enctype="multipart/form-data" в Django 1.1.1.

Следующее фиктивное приложение, например, прекрасно работает в devсервер.

views.py

from django import forms
from django.shortcuts import render_to_response

class UploadForm(forms.Form):
    cpk = forms.CharField(max_length=256)
    f = forms.FileField()

def my_upload_view(request):
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            print "Got cpk",form.cleaned_data['cpk']
            print "Got file",request.FILES['f'].read()
    else:
        form = UploadForm()
    return render_to_response('upload.html', {'form':form})

upload.html

<html>
<body>
    <form enctype="multipart/form-data" method="post">
        {{ form.f }}
        {{ form.cpk }}
        <input type="submit" />
    </form>
</body>
</html>

Я использую djangoэкземпляр формы для рендеринга файла ввода, но он делает очень распространенным <input type="file" name="f" id="id_f" />.

Используя этот пример, я получаю содержимое файла (я проверял, используя простой текстовый файл), распечатанный на терминалс моего сервера разработки.Вот несколько рекомендаций и тестов, которые я могу порекомендовать:

  • убедитесь, что загружаемый файл меньше settings.FILE_UPLOAD_MAX_MEMORY_SIZE (по умолчанию 2,5 МБ)
  • , дважды проверьте, что выне определили никаких пользовательских обработчиков загрузки файлов, которые могут нарушать процесс загрузки (settings.FILE_UPLOAD_HANDLERS)
  • попробуйте загрузить очень простой файл (например, небольшой текстовый файл), чтобы увидеть, сохраняется ли проблема с чем-то базовым
  • используйте инструмент для проверки необработанного HTTP-трафика запросов / ответов (Firebug сделает это за вас, и есть несколько автономных приложений, которые будут выступать в качестве прокси, чтобы помочь вам и здесь) ... иногдарешение выскочит, когда вы увидите необработанный трафик.

Если вы еще не нашли их, в документах для загрузки файла django имеется достаточное количество примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...