这是使用Django 1.7和Django CMS 3.1.0。
我有一个大型的Django项目已经生产了几个月而没有任何问题。我目前正在向它添加Django CMS,并发现如果我的缓存处于脱机状态,我无法在没有异常的情况下发出任何管理命令。 在我将Django CMS添加到我的项目之前,它一直很好用。
这可以通过以下方式复制:
按照documentation中的说明手动安装Django CMS。
设置连接到可脱机的缓存服务的默认缓存。在我的情况下,我连接到Redis服务器,这是我的Django项目的使用。在开发中运行manage.py runserver
之前和我的Web应用程序在生产中联机之前,此服务器是手动启动的。打开缓存服务会使问题消失,但有时我想在关闭缓存服务的情况下运行一些管理命令。
如果我在Redis实例离线时运行任何管理命令,则会出现故障。例如,如果我只是在没有命令的情况下运行./manage.py
,我会得到类似这样的跟踪:
Traceback (most recent call last):
File "./manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
utility.execute()
File "env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
django.setup()
File "env/local/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
apps.populate(settings.INSTALLED_APPS)
File "env/local/lib/python2.7/site-packages/django/apps/registry.py", line 115, in populate
app_config.ready()
File "env/local/lib/python2.7/site-packages/django/contrib/admin/apps.py", line 22, in ready
self.module.autodiscover()
File "env/local/lib/python2.7/site-packages/django/contrib/admin/__init__.py", line 23, in autodiscover
autodiscover_modules('admin', register_to=site)
File "env/local/lib/python2.7/site-packages/django/utils/module_loading.py", line 74, in autodiscover_modules
import_module('%s.%s' % (app_config.name, module_to_search))
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "env/local/lib/python2.7/site-packages/cms/admin/__init__.py", line 11, in <module>
plugin_pool.plugin_pool.discover_plugins()
File "env/local/lib/python2.7/site-packages/cms/plugin_pool.py", line 33, in discover_plugins
invalidate_cms_page_cache()
File "env/local/lib/python2.7/site-packages/cms/views.py", line 335, in invalidate_cms_page_cache
version = _get_cache_version()
File "env/local/lib/python2.7/site-packages/cms/views.py", line 280, in _get_cache_version
version = cache.get(CMS_PAGE_CACHE_VERSION_KEY)
File "env/local/lib/python2.7/site-packages/django_redis/cache.py", line 30, in _decorator
raise e.parent
redis.exceptions.ConnectionError: Error 2 connecting to unix socket: /var/tmp/foo/redis/foo_dev.redis.sock. No such file or directory.
如果我只是从cms
删除INSTALLED_APPS
应用,这足以防止出现问题,但这不是一个可以接受的解决方法。
有没有办法在不删除Django CMS或在发出任何管理命令之前打开缓存服务的情况下解决这个问题?
答案 0 :(得分:1)
对于Django 1.7和1.8以及可预见的未来版本,问题是相同的。 <1.6>及更早版本不会发生不可能,但不太可能。
问题在于,如果您使用最有可能用于Django项目的配置,那么只要cms
应用程序初始化,Django CMS就会导致访问缓存。
以下是运行管理命令时发生的情况,省略了一些不相关的步骤:
Django完成了应用程序初始化过程。 (已记录here。)当它到达django.contrib.admin
时,它会使用此应用的默认AppConfig
。
AppConfig
调用admin
的{{1}}函数的默认admin
。 (记录here。)
最终autodiscover()
获取autodiscover()
'自己的cms
文件并加载它。此文件启动Django CMS插件的发现,这反过来导致Django CMS使其页面缓存无效。因此,您可以在那里获得缓存访问权限,但由于您的缓存服务未启用而失败。
您可以执行的操作是,有关管理员explains的文档,请在admin.py
而不是django.contrib.admin.apps.SimpleAdminConfig
中使用INSTALLED_APPS
。此应用配置不会自动调用django.contrib.admin
。使用此配置时,您必须自己致电autodiscover()
。将呼叫置于项目范围autodiscover()
,就像我们在1.7之前要求的那样,是您最好的选择:
urls.py
以上内容应该清楚表明,在1.6之前的Django版本中不太可能出现OP的问题。按照Django的文档来配置他们的项目的人将在他们的from django.contrib import admin
admin.autodiscover()
文件中调用autodiscover()
,只有在进行网络查询时才会读取该文件。但是,对于那些偏离推荐做法并最终在其他地方调用urls.py
的项目的人来说,问题可能会发生。