簡體   English   中英

自定義上下文處理器中的Django緩存

[英]Django caching in a custom context processor

我有一個自定義上下文處理器,可用於生成動態菜單和站點范圍內的當前應用程序列表:

from portal.models import *

def base_items(request):
    return { 
        ...
        'app_items': App.objects.filter(isonline=True), 
        'menu_items': MainMenu.objects.all().order_by('position'),
    } 

編輯:

我的模板(請注意,許多這些URL在Django框架之外,並且根據語言而有所不同。因此,需要將它們硬編碼到db字段中:

<ul class="menu">
            {% for item in menu_items %}
                {% if LANGUAGE_CODE = "en-us" %}
                <li><a title="{{ item.title_en }}" href="{{ item.url_en }}">{{ item.title_en }}</a>
                    <ul>
                    {% for subitem in item.submenu_set.all %}
                        <li><a title="{{ subitem.title_en }}" href="{{ subitem.url_en }}">{{ subitem.title_en }}</a></li>
                    {% endfor %}        
                    </ul>
                </li>
                    {% else %}
                <li><a title="{{ item.title_es }}" href="{{ item.url_es }}">{{ item.title_es }}</a>
                    <ul>
                    {% for subitem in item.submenu_set.all %}
                <li><a title="{{ subitem.title_es }}" href="{{ subitem.url_es }}">{{ subitem.title_es }}</a></li>
                    {% endfor %}        
                    </ul>
                </li>
                {% endif %}
            {% endfor %}    
            </ul>  

我的問題是-如何緩存這些不經常更改的結果?

我嘗試了@cache_page裝飾器,但是可以看到我的頁面仍在訪問菜單項對象的數據庫。

任何幫助,不勝感激。

您可以使用django 低級緩存API 請注意,您可能必須將查詢集強制轉換為list

或者 ,您可以緩存使用這些查詢集的模板片段 ,因為查詢集是lazy

嘗試將lamdas表達式返回到模板:

 'app_items': lambda: App.objects.filter(isonline=True), 

這樣,它就不會被編譯/緩存,並且可以動態工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM