#31734: warnings.warn() fails when looping over memcache_key_warnings()
-----------------------------------------------+------------------------
               Reporter:  Rich Rauenzahn       |          Owner:  nobody
                   Type:  Bug                  |         Status:  new
              Component:  Core (Cache system)  |        Version:  2.2
               Severity:  Normal               |       Keywords:
           Triage Stage:  Unreviewed           |      Has patch:  0
    Needs documentation:  0                    |    Needs tests:  0
Patch needs improvement:  0                    |  Easy pickings:  1
                  UI/UX:  0                    |
-----------------------------------------------+------------------------
 I think I found a bug in cache backends -- while running unit tests I was
 getting:

 TypeError: 'type' object cannot be interpreted as an integer

 I'm not sure why that exact message, but it arises here:


 {{{
 > .../virtualenv-3.6.8/lib64/python3.6/site-
 packages/django/core/cache/backends/base.py(250)validate_key()
     248         """
     249         for warning in memcache_key_warnings(key):
 --> 250             warnings.warn(warning, CacheKeyWarning)
     251
     252     def incr_version(self, key, delta=1, version=None):

 }}}

 I think the problem is that for loop is receiving a list of tuples, but
 they are interpreted as a list of strings:


 {{{
 ipdb> key
 ":1:<redacted but probably invalid for memcache"

 # The generator returns tuples of (message, warning type)

 ipdb> for x in memcache_key_warnings(key): print(x)
 ('Cache key contains characters that will cause errors if used with
 memcached:
 ":1:BuildAPI._request:(\'http://buildapi.eng.vmware.com/sb/build/1895757\',
 expire=10)"', <class 'django.core.cache.backends.base.CacheKeyWarning'>)

 # But "warning" passed to warning.warn() is the tuple...

 ipdb> warning
 ('Cache key contains characters that will cause errors if used with
 memcached:
 ":1:BuildAPI._request:(\'http://buildapi.eng.vmware.com/sb/build/1895757\',
 expire=10)"', <class 'django.core.cache.backends.base.CacheKeyWarning'>)
 ipdb>
 }}}

 I think it should be passing warning.warn(warning[0], warning[1])  or
 warning.warn(*warning)

 Django 2.2.13 is what I am using.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/31734>
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.57cfac2ceccba6d3b09b9e206901d3db%40djangoproject.com.

Reply via email to