由现有属性引起的AttributeError

时间:2016-02-19 14:32:10

标签: django pylibmc

当我的django应用程序尝试从缓存中获取或存储某些内容时,有时会出现以下错误:

    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'

但为什么呢?模块具有属性,并且大多数时候它都有效,没有可以打破这个名称的同名文件,在哪里查找原因?

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

1 个答案:

答案 0 :(得分:1)

tl; dr:尝试在应用启动位置导入pylibmc,例如uwsgimanage.py文件。

我的猜测是在PyLibMCCache.__init__内的请求线程中导入pylibmc而不是在应用程序启动时导致多线程问题。 (IMO Django在那里进行导入,因为并非所有Django安装都使用pylibmc,因此他们不应该强制它作为依赖项在每个应用程序上使用)

虽然我对import工作原理的内部不够熟悉,但我怀疑会发生什么,如下所示

  1. 主题#1尝试导入pylibmc
  2. 主题#1在sys.modules pylibmc中为pylibmc
  3. 添加占位符
  4. 线程#2尝试导入-> AttributeError sys.modules被提升
  5. 主题#1已完成更新pylibmc.NotFound,现在importlib.util.LazyLoader可用
  6. 通常,Python似乎discourage runtime loading of modules而不是启动时加载。

    强调是我的

      

    注意:对于启动时间至关重要的项目,此类[ $(document).ready(function () { console.log('Script loaded...'); $("#btn-reg").click(function(){ var newusername = $("#username").val(); var newpassword = $("#newpassword").val(); var newclub = $("#newclub").val(); $.ajax({ method: "POST", url: "classCalling.php", data: { newusername: newusername,newpassword: newpassword,newclub: newclub }, success:function(data){ alert(data); } }); }); }); ]允许在未使用的情况下最大程度地降低加载模块的成本。对于启动时间不是必需的项目,由于加载期间创建的错误消息被推迟并因此发生在上下文之外,因此强烈建议不要使用此类