#29293 closed Cleanup/optimization (invalid)
valid UUID is not a valid UUID
Reported by: | Jorge Alfaro | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.11 |
Severity: | Normal | Keywords: | UUIDField, postgresql, uuid |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When using UUIDField with postgresql sometimes the field initialization will fail, seems like postgresql sometimes returns some kind of UUID value that fails the
isinstance(value, uuid.UUID)
validation and causes an exception, I don't really know how to reproduce, because for a time it happened to me almost every day (randomly), but it's been 7-8 months since the last time. I also want to clarify, once this problem "starts", it will fail every single time until you restart the server, after the restart everything works as it should (for a time aparently). I'm pretty sure it's not django's fault but it should be fairly easy to protect against this scenario. I think adding str() around value should fix this, it would look like this:
def to_python(self, value): if value is not None and not isinstance(value, uuid.UUID): try: return uuid.UUID(str(value)) except (AttributeError, ValueError): raise exceptions.ValidationError( self.error_messages['invalid'], code='invalid', params={'value': value}, ) return value
Since django already is using the "hex" parameter for the UUID constructor and hex asumes a string, this makes sense to me
Link with aditional info:
https://stackoverflow.com/questions/45990550/valid-uuid-is-not-a-valid-uuid
Change History (3)
follow-up: 2 comment:1 by , 7 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 7 years ago
I completly understand it's not a django problem, but the links posted don't really provide a solution just an explanation to the problem, and I think django can "recover" from this issue easily with the solution I provided, do you see any problem with the extra validation? (the str())
Replying to Tim Graham:
I don't think Django is at fault. From django-users:
I think the problem comes from mod_wsgi. I had the same problem when virtualhost listen on multiple ports.
Please look at this GH issue https://github.com/GrahamDumpleton/mod_wsgi/issues/206
and try this by https://github.com/GrahamDumpleton/mod_wsgi/issues/206#issuecomment-305019825 by Dumpleton.
The real issue : isinstance(value, uuid.UUID) is failling because of the use of sub interpreters.
Details in the mod_wsgi documentation : http://modwsgi.readthedocs.io/en/develop/user-guides/processes-and-threading.html#python-sub-interpreters and http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIApplicationGroup.html.
comment:3 by , 7 years ago
I don't think Django should make any effort to work around broken configurations. If isinstance(value, uuid.UUID)
doesn't work, other code may also not work.
I don't think Django is at fault. From django-users: