如何在Django中构建一个类似于Slack的左面板以最小化数据库访问

如何在Django中构建一个类似于Slack的左面板以最小化数据库访问,django,database,caching,Django,Database,Caching,我正在开发一个Django应用程序,它有一个类似Slack的左面板。它显示当前用户已订阅的频道。因为每个页面都会显示这个面板,所以我将它放在基本模板中。我的问题是,因为面板内容是动态的,所以每次加载页面时,它都会创建一个数据库访问,为用户获取频道列表 优化它的最佳方法是什么?如果用户订阅了一个新频道或离开了一个频道,我是否应该缓存左侧面板的内容并使其无效?还有其他选择吗?如果您谈论的是单个HTML页面,并且不想重新设计站点以使用带有web服务调用的前端JavaScript框架,那么缓存可以节省许

我正在开发一个Django应用程序,它有一个类似Slack的左面板。它显示当前用户已订阅的频道。因为每个页面都会显示这个面板,所以我将它放在基本模板中。我的问题是,因为面板内容是动态的,所以每次加载页面时,它都会创建一个数据库访问,为用户获取频道列表


优化它的最佳方法是什么?如果用户订阅了一个新频道或离开了一个频道,我是否应该缓存左侧面板的内容并使其无效?还有其他选择吗?

如果您谈论的是单个HTML页面,并且不想重新设计站点以使用带有web服务调用的前端JavaScript框架,那么缓存可以节省许多数据库调用。虽然我推荐memcached或类似的东西,但数据库缓存是最容易设置的。将此添加到设置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'django_db_cache',
    }
}
然后运行此命令以创建数据库缓存:

django-admin createcachetable
包装模板的部分如下所示:

{% cache 3600 "leftnav-" request.user.get_username %}
.......
{% endcache %}
这将使用leftnav username键为下一个小时创建一个缓存条目,当用户向其中添加或删除和项时,您必须将其从缓存中删除

完成后,您可能还希望在开发环境中使用虚拟缓存。这基本上关闭了开发中的缓存:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}

祝你好运

为什么要优化它?它跑得慢吗?如果它没有执行,请尝试找出原因。只是认为它会生成太多不必要的DB调用,因为左侧面板的内容不会经常更改。请安装django调试工具栏,看看是否如此。