Python Django如何正确缓存以重用数据?(使用Django mptt包和redis模块)
我正在制作一种动态菜单。当您单击顶部的菜单时,它会在左侧显示子菜单。我用stackoverflow和google的关键字“动态菜单”搜索。我有了制作这种菜单的想法。我做的像下面这样 1) 通过自定义上下文处理器将上下文中的数据(菜单列表)呈现到模板 2) 使用django mptt包提供的自定义模板标记 3) 在基本模板中显示顶部菜单 4) 移动到另一个模板以根据单击的顶部菜单显示子菜单 我制作了自定义上下文处理器,以便在每个模板的上下文中使用菜单 上下文处理器.pyPython Django如何正确缓存以重用数据?(使用Django mptt包和redis模块),python,django,caching,Python,Django,Caching,我正在制作一种动态菜单。当您单击顶部的菜单时,它会在左侧显示子菜单。我用stackoverflow和google的关键字“动态菜单”搜索。我有了制作这种菜单的想法。我做的像下面这样 1) 通过自定义上下文处理器将上下文中的数据(菜单列表)呈现到模板 2) 使用django mptt包提供的自定义模板标记 3) 在基本模板中显示顶部菜单 4) 移动到另一个模板以根据单击的顶部菜单显示子菜单 我制作了自定义上下文处理器,以便在每个模板的上下文中使用菜单 上下文处理器.py from manager.
from manager.models import Menu
def menu(request):
menu_list = list(Menu.objects.all())
return {'menu':menu_list}
py(示例)
如果您能为我的问题提供答案和见解,我将不胜感激。谢谢你的阅读 您可以简单地在数据库中打开日志记录,以便每次发出查询时都将对其进行记录。然后调用您的视图。如果缓存工作,那么对菜单的查询将只发出一次。哦。好提示。非常感谢。您可以简单地在数据库中打开日志记录,以便每次发出查询时都将对其进行记录。然后调用您的视图。如果缓存工作,那么对菜单的查询将只发出一次。哦。好提示。非常感谢。
{% load mptt_tags %}
<nav id="{{ menu_id }}" class="tree-menu">
<ul>
{% recursetree menu %}
<li class="menu
{% if node.is_root_node %}root{% endif %}
{% if node.is_child_node %}child{% endif %}
{% if node.is_leaf_node %}leaf{% endif %}
{% if current_menu in node.get_descendants %}open{% else %}closed{% endif %}
">
<a href="?{{ node.menu_name }}={{ node.pk }}">{{ node.menu_name }}</a>
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
{% if node.items and node.items.exists %}
<ul class="items">
{% for item in node.items.all %}
{% if item_template %}
{% include item_template %}
{% else %}
{% include "menu/tree-item.html" %}
{% endif %}
{% endfor %}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
</nav>
@register.tag
def recursetree(parser, token):
"""
Iterates over the nodes in the tree, and renders the contained block for each node.
This tag will recursively render children into the template variable {{ children }}.
Only one database query is required (children are cached for the whole tree)
Usage:
<ul>
{% recursetree nodes %}
<li>
{{ node.name }}
{% if not node.is_leaf_node %}
<ul>
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
"""
bits = token.contents.split()
if len(bits) != 2:
raise template.TemplateSyntaxError(_('%s tag requires a queryset') % bits[0])
queryset_var = template.Variable(bits[1])
template_nodes = parser.parse(('endrecursetree',))
parser.delete_first_token()
return RecurseTreeNode(template_nodes, queryset_var)
from manager.models import Menu
from django.core.cache import cache
def menu(request):
menu_list = cache.get_or_set('menu_list', list(Menu.objects.all()))
return {'menu':menu_list, 'redis':"Food"}