Загрузка файла deform переопределяет мое сообщение об ошибке с помощью Invalid pstruct: not a FieldStorage instance

Если я не выбираю файл и просто нажимаю «отправить», я получаю следующую ошибку: -

Invalid pstruct: {'upload': "b'' is not a FieldStorage instance"}

Это не то поведение, которое я получаю на демонстрационном сайте deform, где оставление его пустым приводит к более разумному ' Требуется' сообщение об ошибке.

Использование моего собственного валидатора, как показано ниже, не решает проблему: -

def validate_file(node, value, **kwargs):
    if not value:
        raise colander.Invalid(node, "Please select a file")

class Schema(colander.MappingSchema):
    excel_file = colander.SchemaNode(deform.FileData(),
            widget=deform.widget.FileUploadWidget(tmpstore),
            validator=validate_file)

Я вижу, что возникает ошибка, но вывод e.render(), где e — это ValidationFailure из form.validate, не соответствует самой ошибке. Соответствующий исходный код deform находится в 'widget.py', где класс _FieldStorage проверяет, имеет ли cstruct атрибут file, и вызывает собственное исключение Invalid.

Вот функция, которая выполняет вызов проверки (на самом деле стандартные вещи), которая возвращает отображаемую страницу.

def generate_upload_form(request):
    form = deform.Form(upload_schema, buttons=('submit',))
    if getattr(request, 'POST') and 'submit' in request.POST:
        try:
            value_dict = form.validate(request.POST.items())
        except deform.ValidationFailure as e:  # Invalid form
            form = e.render()
        else:  # Successfully validated, now do operation
            upload_form_operation(request, value_dict)
    if isinstance(form, deform.Form):
        form = form.render()
    return form

Как мне отобразить собственное сообщение об ошибке без внесения обезьяньих исправлений в кодовую базу deform?


person Ng Oon-Ee    schedule 13.03.2017    source источник
comment
Также см.: bountysource.com/issues /   -  person Jasper van den Bosch    schedule 11.05.2017
comment
Это должно было быть решено на github.com/Pylons/deform/pull/360. Если нет, то откройте новую тему.   -  person Steve Piercy    schedule 12.05.2020


Ответы (1)


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

Один конкретный элемент, который упускается из виду, заключается в том, чтобы убедиться, что ваша HTML-форма имеет дополнительное определение enctype, например.

 enctype="multipart/form-data"

Без этого форма отправляет имя файла в виде строки, которая затем завершится ошибкой.

person Mr-F    schedule 21.03.2017
comment
Это вполне может быть так (сейчас у меня нет доступа к системе), но я не определяю форму в html, а просто использую html непосредственно из form.render(). Будет ли это ошибкой (при условии, что это реальная проблема)? - person Ng Oon-Ee; 22.03.2017
comment
После проверки системы форма enctype действительно является multipart/form-data, так что это не источник проблемы. - person Ng Oon-Ee; 22.03.2017
comment
@ NgOon-Ee Думаю, мне нужно увидеть еще немного кода. Можно ли увидеть, как вы на самом деле проверяете и обрабатываете возникшее исключение, пожалуйста? - person Mr-F; 22.03.2017
comment
Добавил это. Насколько я могу судить, это стандартная практика: сначала я создаю форму из схемы, а затем использую эту форму для проверки на соответствие request.POST.items(). Я ловлю ValidationFailure и визуализирую его. Путь else, вероятно, не важен для этого вопроса, так как моя проблема возникает, когда есть ValidationFailure (если я выбираю файл, тогда путь else активируется правильно). - person Ng Oon-Ee; 23.03.2017