#21729: DecimalField.to_python() fails on values with invalid unicode start byte
-----------------------------------+--------------------------------------
     Reporter:  brett_energysavvy  |                    Owner:  nobody
         Type:  Bug                |                   Status:  closed
    Component:  Forms              |                  Version:  1.5
     Severity:  Normal             |               Resolution:  needsinfo
     Keywords:                     |             Triage Stage:  Unreviewed
    Has patch:  0                  |      Needs documentation:  0
  Needs tests:  0                  |  Patch needs improvement:  0
Easy pickings:  0                  |                    UI/UX:  0
-----------------------------------+--------------------------------------

Comment (by thnee):

 I think that with current Django code, a field should never receive such
 byte streams.

 Not quite sure what this quote is referring to, possibly how requests are
 processed and handled before going into a view?
 The Form class makes no rules about about where the data must come from.

 I am hitting this issue when building an API using a Form's `CharField`
 that takes the user's data from a CSV file.
 They sent me a a string that ends in a partial UTF-8 character (only the
 first byte, and not the second), and the form raises
 `DjangoUnicodeDecodeError` on `is_valid`.
 Pretty much exactly what the original example demonstrates.

 I argue that there is a precedence catch this exception (possibly in the
 `Field` class), since the job of a `Form` is to take any user input data
 and produce a list of errors. And when the user did send invalid data, the
 Form crashed instead of producing an error.

 Here is (the relevant part of) a stack trace:

 {{{
   File "/home/my_user/my_project/apps/my_app/parsers.py", line 222, in
 parse_feed
     if not form.is_valid():
   File "/usr/local/lib/python2.6/dist-packages/django/forms/forms.py",
 line 129, in is_valid
     return self.is_bound and not bool(self.errors)
   File "/usr/local/lib/python2.6/dist-packages/django/forms/forms.py",
 line 121, in errors
     self.full_clean()
   File "/usr/local/lib/python2.6/dist-packages/django/forms/forms.py",
 line 273, in full_clean
     self._clean_fields()
   File "/usr/local/lib/python2.6/dist-packages/django/forms/forms.py",
 line 288, in _clean_fields
     value = field.clean(value)
   File "/usr/local/lib/python2.6/dist-packages/django/forms/fields.py",
 line 148, in clean
     value = self.to_python(value)
   File "/usr/local/lib/python2.6/dist-packages/django/forms/fields.py",
 line 208, in to_python
     return smart_text(value)
   File "/usr/local/lib/python2.6/dist-packages/django/utils/encoding.py",
 line 73, in smart_text
     return force_text(s, encoding, strings_only, errors)
   File "/usr/local/lib/python2.6/dist-packages/django/utils/encoding.py",
 line 119, in force_text
     raise DjangoUnicodeDecodeError(s, *e.args)
 django.utils.encoding.DjangoUnicodeDecodeError: 'utf8' codec can't decode
 byte 0xc3 in position 29: unexpected end of data. You passed in 'The
 Chesterfield brand Stor h\xc3' (<type 'str'>)
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/21729#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/075.a21a17f2284c3dfe3a830059fd89ed07%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to