Opened 6 years ago

Closed 6 years ago

Last modified 6 years ago

#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)

comment:1 by Tim Graham, 6 years ago

Resolution: invalid
Status: newclosed

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.

in reply to:  1 comment:2 by Jorge Alfaro, 6 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 Tim Graham, 6 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.

Note: See TracTickets for help on using tickets.
Back to Top