2017-03-13 17 views
6

Nếu tôi không chọn một tập tin và chỉ cần nhấp vào 'submit', tôi nhận được lỗi sau: -biến dạng File Upload ghi đè thông báo lỗi của tôi với pstruct không hợp lệ: không phải là một ví dụ FieldStorage

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

Đây không phải là hành vi tôi nhận được trên deform demo site nơi để trống kết quả trong thông báo lỗi 'Bắt ​​buộc' hợp lý hơn.

dùng validator của riêng tôi như dưới đây không giải quyết vấn đề này: -

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) 

tôi có thể thấy rằng các lỗi được nâng lên, nhưng đầu ra của e.render() trong đó e là ValidationFailure từ form.validate không phù hợp với lỗi chinh no. Mã nguồn deform có liên quan nằm trong 'widget.py', trong đó lớp _FieldStorage kiểm tra xem cstruct có thuộc tính file và tăng ngoại lệ Invalid riêng của nó hay không.

Đây là chức năng thực hiện cuộc gọi xác thực (thực tế là chuẩn bog), trả về trang được hiển thị.

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 

Làm cách nào để hiển thị thông báo lỗi của riêng tôi mà không cần vá mã vạch deform?

+0

Xem thêm: https://www.bountysource.com/issues/43000745-fileuploadwidget-raises-error-if-file không được cung cấp –

Trả lời

1

Bạn có chắc chắn thực sự đã gửi dữ liệu biểu mẫu chính xác không? Lỗi này thường xảy ra khi biến dạng cố gắng deserialize giá trị được gửi thông qua gõ vịt.

Một mục cụ thể bị bỏ qua là đảm bảo biểu mẫu HTML của bạn có mã hóa bổ sung xác định ví dụ:

enctype="multipart/form-data" 

Without này dưới hình thức nộp filename như là một chuỗi mà sau đó sẽ thất bại

+0

Điều này cũng có thể là nó (không có quyền truy cập vào hệ thống ngay bây giờ) nhưng tôi không xác định biểu mẫu bằng html, chỉ cần sử dụng html trực tiếp từ form.render(). Điều đó có làm cho lỗi này không (giả sử đó là vấn đề thực tế)? –

+0

Sau khi đã kiểm tra hệ thống, mẫu mã hóa thực sự là nhiều phần/biểu mẫu dữ liệu, vì vậy đây không phải là nguồn của sự cố. –

+0

@ NgOon-Ee Tôi nghĩ tôi cần xem thêm một chút mã. Có thể thấy bạn đang thực sự xác nhận và xử lý ngoại lệ đã nêu không? –

Các vấn đề liên quan