[Django] #23895: ResolverMatch with some views is not pickleable

36 views
Skip to first unread message

Django

unread,
Nov 22, 2014, 12:50:36 PM11/22/14
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
-----------------------------+--------------------
Reporter: kezabelle | Owner: nobody
Type: Bug | Status: new
Component: Core (URLs) | Version: 1.7
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
-----------------------------+--------------------
given something like the following:

{{{

def my_fbv(request):
return HttpResponse('yay')

# urls.py
urlpatterns = [
url('whatever', my_fbv, name='my_fbv'),
]
}}}

It is possible to do the following:
{{{
from django.core.urlresolvers import resolve
from pickle import dumps, loads
loads(dumps(resolve('whatever')))
}}}
and end up with a working `ResolverMatch`

However, given a Class Based View (mapped to a urlconf via
`MyView.as_view()`), or something like contrib.admin, you get something
like the following:
{{{
dumps(resolve('/admin/myapp/'))
[...]
# for the admin ...
PicklingError: Can't pickle <function app_index at 0x109f05de8>: it's not
found as django.contrib.admin.sites.app_index
# for a CBV:
PicklingError: Can't pickle <function Homepage at 0x109f16b90>: it's not
the same object as myapp.views.Homepage
}}}
Both of which are raised by pickle's `save_global(self, obj, name, pack)`
which recognises that it's a module+name combo (thus should be in scope)
but isn't the same object in identity (`if x is not y`)

Ordinarily, this is not a problem, but `resolver_match` is set onto a
`request`, and I'm using the `django.test.client.Client` with
multiprocessing, which requires the ability to pickle data to send back
and forth, and evidently somewhere within the `TemplateResponse`s I'm
dealing with, the request is being serialised (if I had to guess --
probably in the context) and is '''sometimes''' failing (depending on the
type of view mounted)

Ideally, every `ResolverMatch` should be serialisable, or none should be,
instead of the current situation where the project's urlconf may denote
success or failure.

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

Django

unread,
Nov 25, 2014, 7:01:58 PM11/25/14
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
-----------------------------+------------------------------------

Reporter: kezabelle | Owner: nobody
Type: Bug | Status: new
Component: Core (URLs) | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-----------------------------+------------------------------------
Changes (by timgraham):

* needs_better_patch: => 0
* needs_docs: => 0
* needs_tests: => 0
* stage: Unreviewed => Accepted


--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:1>

Django

unread,
Jan 23, 2015, 8:02:36 AM1/23/15
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
-----------------------------+------------------------------------

Reporter: kezabelle | Owner: nobody
Type: Bug | Status: new
Component: Core (URLs) | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-----------------------------+------------------------------------

Comment (by tomchristie):

Haven't had a chance to confirm this much but appears that on 1.8-alpha
this is consistently an issue, making responses non-cachable with
CacheMiddleware. Alternative take would be for HttpResponse to take a more
structured approach to caching - rather than simply dumping all attributes
to pickle, just store the basics that allow a fresh HttpResponse with
correct content, status code and headers to be reconstructed. (Eg. we
shouldn't expect ResolverMatch instances to be picklable, but we *should*
be constraining what we pickle for responses)

--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:2>

Django

unread,
Jul 19, 2021, 7:48:22 AM7/19/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
------------------------------+------------------------------------
Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: assigned

Component: Core (URLs) | Version: 1.7
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
------------------------------+------------------------------------
Changes (by zatro):

* owner: nobody => zatro
* status: new => assigned


--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:3>

Django

unread,
Jul 19, 2021, 8:04:48 AM7/19/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
------------------------------+------------------------------------
Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: assigned
Component: Core (URLs) | Version: 4.0

Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
------------------------------+------------------------------------
Changes (by zatro):

* has_patch: 0 => 1
* version: 1.7 => 4.0


Comment:

I've done a fix for this but it might not be the ideal solution. Thoughts?
If it's okay, please let me know anything the PR is missing.
[https://github.com/django/django/pull/14664 PR]

--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:4>

Django

unread,
Jul 23, 2021, 2:37:01 AM7/23/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
------------------------------+------------------------------------
Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: assigned
Component: Core (URLs) | Version: 4.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1

Easy pickings: 0 | UI/UX: 0
------------------------------+------------------------------------
Changes (by Mariusz Felisiak):

* needs_better_patch: 0 => 1


--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:5>

Django

unread,
Jul 27, 2021, 6:22:38 PM7/27/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
------------------------------+------------------------------------
Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: assigned
Component: Core (URLs) | Version: 4.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
------------------------------+------------------------------------
Changes (by zatro):

* needs_better_patch: 1 => 0


Comment:

I've now made the changes discussed and squashed the commits.

--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:6>

Django

unread,
Jul 28, 2021, 2:10:20 AM7/28/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
------------------------------+------------------------------------
Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: assigned
Component: Core (URLs) | Version: 4.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1

Easy pickings: 0 | UI/UX: 0
------------------------------+------------------------------------
Changes (by Mariusz Felisiak):

* needs_better_patch: 0 => 1


--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:7>

Django

unread,
Jul 28, 2021, 2:24:58 PM7/28/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
------------------------------+------------------------------------
Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: assigned
Component: Core (URLs) | Version: 4.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
------------------------------+------------------------------------
Changes (by zatro):

* needs_better_patch: 1 => 0


Comment:

Changes from latest review have now been made.

--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:8>

Django

unread,
Jul 28, 2021, 2:46:00 PM7/28/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
------------------------------+------------------------------------
Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: assigned
Component: Core (URLs) | Version: 4.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
------------------------------+------------------------------------

Comment (by zatro):

Made a new ticket #32969 for improving pickling of `HTTPResponse`s.

--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:9>

Django

unread,
Jul 29, 2021, 12:29:51 AM7/29/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
-------------------------------------+-------------------------------------

Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: assigned
Component: Core (URLs) | Version: 4.0
Severity: Normal | Resolution:
Keywords: | Triage Stage: Ready for
| checkin

Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Mariusz Felisiak):

* stage: Accepted => Ready for checkin


--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:10>

Django

unread,
Jul 29, 2021, 1:05:18 AM7/29/21
to django-...@googlegroups.com
#23895: ResolverMatch with some views is not pickleable
-------------------------------------+-------------------------------------
Reporter: Keryn Knight | Owner: zatro
Type: Bug | Status: closed

Component: Core (URLs) | Version: 4.0
Severity: Normal | Resolution: fixed

Keywords: | Triage Stage: Ready for
| checkin
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by GitHub <noreply@…>):

* status: assigned => closed
* resolution: => fixed


Comment:

In [changeset:"4c6a6d5ac7aa348d5b4b9a4d6bb7cc18af49f72a" 4c6a6d5a]:
{{{
#!CommitTicketReference repository=""
revision="4c6a6d5ac7aa348d5b4b9a4d6bb7cc18af49f72a"
Fixed #23895 -- Prevented pickling of ResolverMatch.

Pickling a ResolverMatch did not work correctly in many cases,
especially with CBVs and URLResolvers in the list of tried URL paths.
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/23895#comment:11>

Reply all
Reply to author
Forward
0 new messages