将Django CMS添加到我的项目后,管理命令失败并出现缓存错误。我该如何解决?

时间:2015-05-08 14:43:46

标签: python django django-cms django-cache

这是使用Django 1.7和Django CMS 3.1.0。

我有一个大型的Django项目已经生产了几个月而没有任何问题。我目前正在向它添加Django CMS,并发现如果我的缓存处于脱机状态,我无法在没有异常的情况下发出任何管理命令。 在我将Django CMS添加到我的项目之前,它一直很好用。

这可以通过以下方式复制:

  1. 按照documentation中的说明手动安装Django CMS。

  2. 设置连接到可脱机的缓存服务的默认缓存。在我的情况下,我连接到Redis服务器,这是我的Django项目的使用。在开发中运行manage.py runserver之前和我的Web应用程序在生产中联机之前,此服务器是手动启动的。打开缓存服务会使问题消失,但有时我想在关闭缓存服务的情况下运行一些管理命令。

  3. 如果我在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或在发出任何管理命令之前打开缓存服务的情况下解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题

对于Django 1.7和1.8以及可预见的未来版本,问题是相同的。 <1.6>及更早版本不会发生不可能,但不太可能。

问题在于,如果您使用最有可能用于Django项目的配置,那么只要cms应用程序初始化,Django CMS就会导致访问缓存。

以下是运行管理命令时发生的情况,省略了一些不相关的步骤:

  1. Django完成了应用程序初始化过程。 (已记录here。)当它到达django.contrib.admin时,它会使用此应用的默认AppConfig

  2. AppConfig调用admin的{​​{1}}函数的默认admin。 (记录here。)

  3. 最终autodiscover()获取autodiscover()'自己的cms文件并加载它。此文件启动Django CMS插件的发现,这反过来导致Django CMS使其页面缓存无效。因此,您可以在那里获得缓存访问权限,但由于您的缓存服务未启用而失败。

  4. 解决方案

    您可以执行的操作是,有关管理员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的项目的人来说,问题可能会发生