【问题标题】:How do I replace MemcachedCache with PyMemcacheCache in Django?如何在 Django 中用 PyMemcacheCache 替换 MemcachedCache?
【发布时间】:2021-12-21 16:02:27
【问题描述】:

我在 Django 3.2 上运行我的网站。我在Django’s cache framework 中读到MemcachedCachepython-memcached 已被弃用。我在登台服务器上安装了pymemcache==3.5.0,并在env.ini 中更改为CACHE_URL=pymemcache://127.0.0.1:11211。但是,如果我使用 pip 卸载 python-memcached,我会收到一条错误消息,表明我的代码仍在使用 MemcachedCache,并且它在 import memcache 上失败。

我的代码使用以下导入:

from django.core.cache import cache
from django.core.cache.backends.base import DEFAULT_TIMEOUT

如何将MemcachedCache 替换为PyMemcacheCache,以便MemcachedCache 不会在我的代码中使用?

我正在使用django-environ==0.8.1CACHES 是在我的设置中定义的:

CACHES = {
    'default': env.cache()
}

env 定义为environ.Env()

我的追溯:

Environment:


Request Method: GET
Request URL: https://<...>

Django Version: 3.2.10
Python Version: 3.8.12
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'crispy_forms',
 'friendship',
 'rules.apps.AutodiscoverRulesConfig',
 'sorl.thumbnail',
 'speedy.core.base',
 'speedy.core.accounts',
 'speedy.core.blocks',
 'speedy.core.uploads',
 'speedy.core.messages',
 'speedy.core.profiles',
 'speedy.core.friends',
 'speedy.core.about',
 'speedy.core.privacy',
 'speedy.core.terms',
 'speedy.net.accounts',
 'speedy.match.accounts',
 'speedy.match.likes',
 'speedy.composer.accounts',
 'speedy.mail.accounts',
 'speedy.core.contact_by_form',
 'speedy.match.profiles',
 'speedy.match.matches']
Installed Middleware:
['speedy.core.base.middleware.SessionCookieDomainMiddleware',
 'speedy.core.base.middleware.RemoveExtraSlashesMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.contrib.sites.middleware.CurrentSiteMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'speedy.core.base.middleware.LocaleDomainMiddleware',
 'speedy.core.base.middleware.EnsureCachesMiddleware',
 'speedy.core.base.middleware.UpdateSessionAuthHashMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'speedy.core.accounts.middleware.SiteProfileMiddleware']



Traceback (most recent call last):
  File "<...>/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "<...>/./speedy/core/base/middleware.py", line 139, in __call__
    block_managers.ensure_caches(user=request.user)
  File "<...>/./speedy/core/blocks/managers.py", line 46, in ensure_caches
    blocked_entities = cache_manager.cache_get(blocked_key, sliding_timeout=DEFAULT_TIMEOUT)
  File "<...>/./speedy/core/base/cache_manager.py", line 21, in cache_get
    wrapped_value = cache.get(key, default=DEFAULT_VALUE, version=version)
  File "<...>/env/lib/python3.8/site-packages/django/utils/connection.py", line 15, in __getattr__
    return getattr(self._connections[self._alias], item)
  File "<...>/env/lib/python3.8/site-packages/django/utils/connection.py", line 62, in __getitem__
    conn = self.create_connection(alias)
  File "<...>/env/lib/python3.8/site-packages/django/core/cache/__init__.py", line 44, in create_connection
    return backend_cls(location, params)
  File "<...>/env/lib/python3.8/site-packages/django/core/cache/backends/memcached.py", line 181, in __init__
    import memcache

Exception Type: ModuleNotFoundError at /matches/
Exception Value: No module named 'memcache'

我的仓库:https://github.com/speedy-net/speedy-net

更新:我检查了收到的用于调试的电子邮件,发现设置中的CACHES 等于{'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211'}}

我在https://github.com/joke2k/django-environ/issues/359 上提交了一个问题(可能是一个错误)

【问题讨论】:

  • 您是否更新了设置文件中的CACHES 设置以使用PyMemcacheCache 后端?
  • @IainShelvington 请查看我更新的问题。
  • 能否添加导入错误的回溯?我认为 django-environ 默认会查找名为 .env 的文件,你确定你的 env.ini 正在被读取吗?
  • 您能否在配置CACHES 设置后打印它以检查它是否已实际更新?这是唯一有意义的事情
  • 如果在配置 CACHES 之前打印os.environ,环境变量看起来是否正确,CACHE_URL 是否正确?不知道问题出在哪里,也许 ini 文件从未真正读取过,或者其他东西正在覆盖环境变量?

标签: python django python-memcached pymemcache django-environ


【解决方案1】:

我不知道为什么,但是我在部署期间重新启动服务器的方式没有刷新env.ini,并且服务器记住了旧设置。如果我用sudo reboot 重新启动我的服务器,并使用相同的设置,那么CACHES 等于{'default': {'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache', 'LOCATION': '127.0.0.1:11211'}} 并且站点可以正常工作。我确认如果我在env.ini 中输入虚拟值,那么该网站根本无法运行。但前提是我使用 sudo reboot 重新启动服务器。

【讨论】:

    猜你喜欢
    • 2015-06-05
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多