2016-02-19 2 views
2

Je parfois obtenir les erreurs suivantes lorsque mon application django tente d'obtenir quelque chose de ou stocker dans le cache:AttributeError causée par attribut existant

c = cache.get(pk) 
    File "/opt/python3/lib/python3.4/site-packages/django/core/cache/__init__.py", line 131, in __getattr__ 
    return getattr(caches[DEFAULT_CACHE_ALIAS], name) 
    File "/opt/python3/lib/python3.4/site-packages/django/core/cache/__init__.py", line 113, in __getitem__ 
    cache = _create_cache(alias) 
    File "/opt/python3/lib/python3.4/site-packages/django/core/cache/__init__.py", line 88, in _create_cache 
    return backend_cls(location, params) 
    File "/opt/python3/lib/python3.4/site-packages/django/core/cache/backends/memcached.py", line 185, in __init__ 
    value_not_found_exception=pylibmc.NotFound) 
AttributeError: 'module' object has no attribute 'NotFound' 

mais pourquoi? le module a l'attribut, et la plupart du temps cela fonctionne, il n'y a aucun fichier avec le même nom qui peut casser ceci, où chercher la cause de ceci?

>>> import pylibmc 
>>> pylibmc.NotFound 
<class '_pylibmc.NotFound'> 
>>> 
+0

Cela pourrait très probablement être un bug. Vous pouvez [signaler un problème] (http://github.com/lericson/pylibmc/issues) sur leur dépôt GitHub. – xyres

+0

d'autres explications possibles, votre cache a expiré et vidé, renvoyant un objet vide, ou vous avez utilisé le même 'pk' pour stocker un objet différent par erreur quelque part dans votre code. vérifiez votre code où vous ajoutez cache.set et voyez. –

+0

Pouvez-vous montrer votre 'CACHES' de la config? – Maresh

Répondre

1

tl; dr: essayez d'importer pylibmc à un emplacement de démarrage de l'application, tels que le fichier uwsgi ou manage.py.

Ma conjecture est qu'il est une question multithreading lors de l'importation pylibmc dans un fil de demande à l'intérieur PyLibMCCache.__init__ par opposition au démarrage de l'application. (OMI Django ne l'importation là parce que pas toutes les installations Django utilisent pylibmc, et donc ils ne devraient pas forcer sur chaque application en tant que dépendance)

Alors que je ne suis pas assez familier avec les entrailles de la façon dont import ING fonctionne, je soupçonne que ce qui se passe est quelque chose comme ci-dessous

  1. fil # 1 tente d'importer pylibmc
  2. fil # 1 place un espace réservé à sys.modules pour pylibmc
  3. fil # 2 tente d'importer pylibmc-> le AttributeError est soulevé
  4. fil # 1 a terminé la mise à jour sys.modules et maintenant pylibmc.NotFound est disponible

En général, Python semblent discourage runtime loading of modules par opposition au démarrage chargement de temps.

accent est à moi

Note: Pour les projets où le temps de démarrage est critique, cette classe [importlib.util.LazyLoader] permet de minimiser le coût potentiel de chargement d'un module s'il est jamais utilisé. Pour les projets où le temps de démarrage n'est pas essentiel, l'utilisation de cette classe est fortement déconseillée en raison de messages d'erreur créés pendant le chargement étant reportés et donc hors contexte.