变形文件上传使用无效的pstruct覆盖我的错误消息:不是FieldStorage实例

时间:2017-03-13 09:11:38

标签: python pyramid deform

如果我没有选择文件而只是点击“提交”,我会收到以下错误: -

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

这不是我在deform demo site上的行为,将其留空会导致更合理的“必需”错误消息。

如下所示使用我自己的验证器无法解决问题: -

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的{​​{1}}与错误本身不匹配。相关的form.validate源代码位于“widget.py”中,其中deform类检查_FieldStorage是否具有cstruct属性并引发其自身的file异常。

这是执行验证调用的函数(真的是bog标准的东西),它返回渲染的页面。

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 代码库,我如何显示自己的错误消息?

1 个答案:

答案 0 :(得分:1)

您确定您确实提交了正确的表单数据吗?当deform尝试通过duck typing键反序列化提交的值时,通常会发生此错误。

一个被忽视的特定项目是确保您的HTML表单具有另外的enctype定义,例如。

 enctype="multipart/form-data"

如果没有这个,表单将文件名作为字符串提交,然后失败