Add support for Django 1.7+'s caches

Review Request #8721 — Created Feb. 6, 2017 and discarded

david
Djblets
release-0.10.x
djblets

In Django 1.7, there's a new caches object which supplants the old
get_cache method. This change adds support for that.

Ran Review Board unit tests with log capture disabled. Saw that the
RemovedInDjango19 warnings disappeared.

  • 1
  • 0
  • 0
  • 0
  • 1
Description From Last Updated
This still happens in Django 1.7+, just in a different way. Here's the relevant code from django/core/cache/__init__.py: def close_caches(**kwargs): # ... chipx86 chipx86
reviewbot
  1. Tool: Pyflakes
    Processed Files:
        djblets/cache/forwarding_backend.py
    
    
    
    Tool: PEP8 Style Checker
    Processed Files:
        djblets/cache/forwarding_backend.py
    
    
  2. 
      
chipx86
  1. 
      
  2. djblets/cache/forwarding_backend.py (Diff revision 1)
     
     
     
     
     

    This still happens in Django 1.7+, just in a different way. Here's the relevant code from django/core/cache/__init__.py:

    def close_caches(**kwargs):
        # Some caches -- python-memcached in particular -- need to do a cleanup at the
        # end of a request cycle. If not implemented in a particular backend
        # cache.close is a no-op
        for cache in caches.all():
            cache.close()
    signals.request_finished.connect(close_caches)
    

    So that becomes more tricky... Kinda thinking we might need to disconnect that handler and then connect our own that skips this backend (maybe by storing a flag on the forwarder saying "Ignore the close!", and set before close_caches(), unset after).

    1. We also should have a unit test for this. (Sorry I didn't have one before.)

    2. Reading through the code in django, and the change that introduced this stuff in djblets, I think it's actually much simpler. The old code in django had a single cache backend shared across all threads, whereas now the caches are thread-local. We could therefore simplify this backend for the 1.7+ case to just fetch the cache from caches and then not call close() on the forwarded backend, since the request_finished handler will close both the forwarding and forwarded backends.

      Care to double-check my reasoning?

  3. 
      
david
Review request changed

Status: Discarded

Loading...