#13093 closed (fixed)
cache_page decorator doesn't work on callable classes
Reported by: | Russell Keith-Magee | Owned by: | nobody |
---|---|---|---|
Component: | Core (Cache system) | Version: | 1.2-beta |
Severity: | Keywords: | ||
Cc: | Brian Neal | Triage Stage: | Accepted |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
The cache_page() decorator works fine on views, but fails if you use it on a callable class::
class MyView(object): def __call__(self, request): return HttpResponse()
If you try to wrap this view in urls.py ( cache_page(MyView(), 60)
), you get an error saying "MyView doesn't have attribute __name__". cache_page uses the __name__ attribute to build a cache key, but classes dont have a __name__ attribute. cache_page should also check for __class__.__name__ (or some similar key with a per-instance feature) to allow for wrapping callable classes.
This is a problem for 1.2, because feed views have been moved to a class-based structure, so it is no longer possible to cache feed views using cache_page().
Change History (7)
comment:1 by , 15 years ago
Description: | modified (diff) |
---|---|
Triage Stage: | Unreviewed → Accepted |
comment:2 by , 15 years ago
Cc: | added |
---|
comment:3 by , 15 years ago
It turns out that this is actually due to a bug in Python itself; functools.wraps doesn't check to see if an attribute is available before copying it onto the wrapped view. Luckily, the API for wraps includes a feature that can be used as a workaround; a patch should be committed shortly.
comment:4 by , 15 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:5 by , 15 years ago
comment:6 by , 15 years ago
The backport to 1.1.X here caused bunches of test errors on 1.1.X. See #13111.
Forgot to mention: Thanks to Brian Neal for the report.