#29510: QueryDict.copy() returns closed files when the type of file is TemporaryUploadedFile -------------------------------------+------------------------------------- Reporter: Liquid Scorpio | Owner: Dan | Madere Type: Bug | Status: assigned Component: File | Version: 1.11 uploads/storage | Severity: Normal | Resolution: Keywords: QueryDict, upload, | Triage Stage: Accepted file | Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+-------------------------------------
Comment (by Dan Madere): Replying to [comment:10 Paulo]: > Replying to [comment:9 Claude Paroz]: > > Did you explore possible handling of such file objects in `QueryDict.__deepcopy__`? > > To keep the file on copy? > If so then yes, we can check value for UploadedFile and create a new instance that points to the same underlying file (although I guess that's more shallow than deep copy). > To have fully deep copy we'd have to create new tmp if is on disk or somehow copy the file stream. After trying it, I don't think either of these suggestions is workable, considering the nature of `TemporaryUploadedFile`. It has logic where the file is deleted as soon as it's closed. When copying/streaming the old file's content to the new one, we have a problem where the new file deletes itself immediately. I stepped back, and pondered why are people copying a `QueryDict` anyway, and what do they expect to happen to a `TemporaryUploadedFile` inside? [[https://docs.djangoproject.com/en/dev/ref/request-response/#querydict- objects]]: {{{ class QueryDict¶ In an HttpRequest object, the GET and POST attributes are instances of django.http.QueryDict, a dictionary-like class customized to deal with multiple values for the same key. This is necessary because some HTML form elements, notably <select multiple>, pass multiple values for the same key. The QueryDicts at request.POST and request.GET will be immutable when accessed in a normal request/response cycle. To get a mutable version you need to use QueryDict.copy(). }}} That leads me to think that people are copying a `QueryDict` because it's a nice starting point to have all the query params organized, but they want to modify it, and pass to the template. Doing so would result in a `This QueryDict instance is immutable` exception, and the advice above, so they try to copy the `QueryDict` before modifying it. I propose we omit `TemporaryUploadedFile` values on deep copy of a `QueryDict`, and will open a PR for feedback. -- Ticket URL: <https://code.djangoproject.com/ticket/29510#comment:12> 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 django-updates+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/01070183f8ee9acb-0fc3225e-0eed-453a-9c99-270340a745f1-000000%40eu-central-1.amazonses.com.