最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何優(yōu)雅地改進Django中的模板碎片緩存詳解

 更新時間:2018年07月04日 10:51:55   作者:棲遲于一丘  
這篇文章主要給大家介紹了關于如何優(yōu)雅地改進Django中的模板碎片緩存的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

本文主頁給大家介紹了關于如何改進Django中模板碎片緩存的相關內容,關于Django模板碎片緩存大家可以先看看這篇文章,下面話不多說了,來一起看看詳細的介紹吧

起步

Django 的緩存體系提供了模板片段緩存:

{% load cache %}
{% cache 500 sidebar %}
 .. sidebar ..
{% endcache %}

但使用這個模板緩存還是需要每次都把需要的變量 sidebar 傳給模板,不然當緩存過期時碎片是空白的。于是就需要的視圖中獲取這些數(shù)據:

def test_view(request):
 # code...
 sidebar = get_data()
 return render(reqeust, 'test_view.html', {'sidebar': sidebar})

如果這個數(shù)據獲取的過程比較耗時,那么這個碎片緩存形同虛設。

低級緩存

使用低級緩存能解決數(shù)據獲取耗時問題:

from django.core.cache import cache
def get_data():
 key = 'hot-course'
 result = cache.get(key)
 if result:
 return result
 # 比較耗時的數(shù)據獲取
 result = Course.objects.filter().order_by('-fav_num')[:10]
 cache.set(key, result, 600) # 保存至緩存
 return result

這樣一般就能解決數(shù)據來源耗時問題,一般用了這個方式就不會再用模板碎片緩存了,不然內存中就有兩個緩存了,一個是原始數(shù)據,另一個是渲染成 html 代碼的結果。有點多余,內存寶貴應該用于刀刃上,而且兩個緩存的方式極不優(yōu)雅。

使用這種底層 api 后,還是需要把數(shù)據傳遞到視圖層,如果是公共部分的如輪播部分的視圖,是會被其他模板 include 的,那就需要其他視圖函數(shù)也都獲取一次數(shù)據,再傳遞到模板層。重復的代碼會很多。

有沒有一種好的辦法解決這種情況呢?

優(yōu)雅的改進碎片緩存

改進的碎片緩存需要能按需獲取,最好不需要視圖層的參與。這個要求可以通過標簽來實現(xiàn),我們來自己實現(xiàn)一下這個緩存標簽,在此之前呢,需要做個通用的緩存工具,能夠傳入數(shù)據獲取的函數(shù)來做回調,這部分其實和 Django 的 django.templatetags.CacheNode 類基本一樣。我這邊就寫與其不一樣的地方:

class UserCacheNode(Node):
 """
 優(yōu)雅的自定義模板碎片緩存
 """
 def __init__(self, nodelist, expire_time_var, fragment_name, vary_on, cache_name, fun=None):
 # ...
 self.fun = fun # 用于數(shù)據獲取的回調函數(shù)

 def render(self, context:dict):
 # ...
 if value is None:
  if self.fun: # 實行回調
  context.update(self.fun(*vary_on))
  value = self.nodelist.render(context)
  fragment_cache.set(cache_key, value, expire_time) # 保存至緩存
 return value

然后是制作自定義標簽:

def get_hot_course():
 # 做會調用,函數(shù)返回字典
 print("call hot course")
 hot_courses = Course.objects.filter().order_by('stu_nums')[:5]
 return locals()

@register.tag('hot_course_cache') # 自定義的標簽名稱
def hot_course_cache(parser, token):
 nodelist = parser.parse(('endcache',))
 parser.delete_first_token()
 tokens = token.split_contents()
 cache_name = None

 return UserCacheNode(
 nodelist, parser.compile_filter(tokens[1]),
 tokens[2], # fragment_name can't be a variable.
 [parser.compile_filter(t) for t in tokens[3:]],
 cache_name,
 fun=get_hot_course, # 回調函數(shù)
 )

然后在模板中就可以這么使用:

{% load course_tag %}
{% hot_course_cache 500 hot_courses %}
 ...hot_courses...
{% endcache %}

通過用自定義標簽的方式,就無需視圖層的參與了,緩存標簽的使用方式也和體系中的 cache 相似,由于是自定義的標簽,一些 IDE 會有一些警告,比如我的開發(fā)環(huán)境:

運行上是沒問題的,IDE 可能對這類自定義標簽的支持度不是很好吧。

參考

Custom template tags and filters

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Python中six模塊基礎用法

    Python中six模塊基礎用法

    在本篇文章里小編給大家分享的是關于Python中six模塊基礎用法以及相關知識點,需要的朋友們學習下。
    2019-12-12
  • Python代碼實現(xiàn)動圖倒放

    Python代碼實現(xiàn)動圖倒放

    這篇文章主要介紹了Python代碼實現(xiàn)動圖倒放,文章通過利用gif動圖實現(xiàn)倒放效果,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-03-03
  • Python函數(shù)any()和all()的用法及區(qū)別介紹

    Python函數(shù)any()和all()的用法及區(qū)別介紹

    any函數(shù):any(x),只要x中有一個不為空,0,false就返回True,否則返回False。all(x)函數(shù)必須x中的所有元素均不為空,0,false才會返回True,否則返回False。接下來通過本文給大家介紹Python函數(shù)any()和all()的用法及區(qū)別介紹,需要的朋友參考下吧
    2018-09-09
  • python中的load、loads實現(xiàn)反序列化示列

    python中的load、loads實現(xiàn)反序列化示列

    這篇文章主要介紹python中的load、loads實現(xiàn)反序列化,在python自動化中,我們傳遞一些參數(shù)是需要從文件中讀取過來的,讀取過來的字典并非python對象數(shù)據類型而是string類型,下面來看詳情內容吧
    2021-10-10
  • Python解析MySQL Binlog日志分析情況

    Python解析MySQL Binlog日志分析情況

    文章介紹了如何使用Python解析MySQL的binlog日志,并通過分析binlog來了解數(shù)據庫的變動情況,如大事務、頻繁更新的表等,文章詳細描述了binlog的結構、事件類型以及如何通過解析這些事件來獲取所需的信息,最后,文章提供了一個示例代碼
    2025-01-01
  • Python和Sublime整合過程圖示

    Python和Sublime整合過程圖示

    這篇文章主要介紹了Python和Sublime整合過程圖示,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 如何在向量化NumPy數(shù)組上進行移動窗口

    如何在向量化NumPy數(shù)組上進行移動窗口

    這篇文章主要介紹了如何在向量化NumPy數(shù)組上進行移動窗口的操作,具有很好的參考價值,希望對大家有所幫助。
    2021-05-05
  • 利用python實現(xiàn)3種梯度下降算法

    利用python實現(xiàn)3種梯度下降算法

    梯度下降法是一種優(yōu)化算法,用于求解函數(shù)的最小值或最大值,它通過迭代的方式,沿著函數(shù)的梯度方向逐步調整參數(shù),以找到函數(shù)的極值點,本文給大家介紹了利用python實現(xiàn)3種梯度下降算法,需要的朋友可以參考下
    2023-12-12
  • Python動態(tài)規(guī)劃之零錢兌換問題詳解

    Python動態(tài)規(guī)劃之零錢兌換問題詳解

    這篇文章主要介紹了Python動態(tài)規(guī)劃之零錢兌換問題詳解,這次我們就按照套路模板,再來剖析一道經典動規(guī)題目零錢兌換,計算并返回可以湊成總金額所需的 最少的硬幣個數(shù) 如果沒有任何一種硬幣組合能組成總金額,返回-1,需要的朋友可以參考下
    2023-11-11
  • Selenium環(huán)境變量配置(火狐瀏覽器)及驗證實現(xiàn)

    Selenium環(huán)境變量配置(火狐瀏覽器)及驗證實現(xiàn)

    這篇文章主要介紹了Selenium環(huán)境變量配置(火狐瀏覽器)及驗證實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論

临沧市| 米易县| 台中市| 彝良县| 双鸭山市| 内江市| 辽中县| 娄烦县| 班玛县| 绥芬河市| 新田县| 临洮县| 锡林郭勒盟| 永胜县| 绵阳市| 阳谷县| 松潘县| 冷水江市| 平泉县| 上蔡县| 泸州市| 义乌市| 邵阳市| 遂平县| 怀安县| 沽源县| 郴州市| 天等县| 苍梧县| 桑植县| 四子王旗| 库伦旗| 柏乡县| 栾城县| 湘西| 阿拉尔市| 扎鲁特旗| 大埔县| 尚志市| 石泉县| 盘锦市|