<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Django緩存機(jī)制詳解:從配置到實(shí)戰(zhàn)應(yīng)用

      一、緩存基礎(chǔ)與環(huán)境準(zhǔn)備

      什么是緩存?

      緩存是指保存計(jì)算密集型操作的結(jié)果,當(dāng)再次需要該結(jié)果時(shí)直接從緩存中獲取,而無(wú)需重新計(jì)算。在 Django 中,緩存可以應(yīng)用于不同粒度:

      • 整個(gè)網(wǎng)站緩存
      • 特定視圖緩存
      • 頁(yè)面片段緩存
      • 任意 Python 對(duì)象緩存

      安裝Redis

      Django 支持多種緩存后端,其中 Redis 因其高性能和豐富的特性成為常用選擇。

      • 安裝Redis:過(guò)程略
      • 安裝 Redis 客戶端
      pip install redis
      

      Redis 緩存配置

      在 Django 項(xiàng)目的settings.py文件中,通過(guò)CACHES配置項(xiàng)設(shè)置 Redis 緩存后端。

      • TIMEOUT:默認(rèn)緩存超時(shí)時(shí)間(秒),默認(rèn)為 300 秒(5 分鐘)
      • OPTIONS:傳遞給緩存后端的選項(xiàng)
      • KEY_PREFIX:所有緩存鍵的前綴字符串
      • VERSION:緩存鍵的默認(rèn)版本號(hào)
      • KEY_FUNCTION:定義緩存鍵生成規(guī)則的函數(shù)路徑
      CACHES = {
          "default": {
              "BACKEND": "django.core.cache.backends.redis.RedisCache",
              "LOCATION": "redis://password@127.0.0.1:6379",
              "OPTIONS": {
                  "db": 0,
              },
              "KEY_PREFIX": "mars_framework",  # 緩存前綴
              "TIMEOUT": 60 * 60 * 12,  # 緩存過(guò)期時(shí)間,單位為秒
          }
      }
      

      二、緩存使用策略

      站點(diǎn)緩存(不常用)

      緩存整個(gè)站點(diǎn)是最簡(jiǎn)單的緩存方式,適用于內(nèi)容不常變化的網(wǎng)站。配置方式如下(在settings.pyMIDDLEWARE中添加緩存中間件)

      MIDDLEWARE = [
          'django.middleware.cache.UpdateCacheMiddleware',  # 放在最前面
          # 其他中間件...
          'django.middleware.cache.FetchFromCacheMiddleware',  # 放在最后面
      ]
      

      視圖緩存

      針對(duì)特定視圖進(jìn)行緩存是更靈活的方式,適用于不同視圖有不同更新頻率的場(chǎng)景。

      使用裝飾器緩存視圖

      from django.views.decorators.cache import cache_page
      
      @cache_page(60 * 15)  # 緩存15分鐘
      def my_view(request):
          # 視圖邏輯...
      
      

      視圖緩存的特點(diǎn)

      • 以 URL 為緩存鍵,不同 URL 指向同一視圖會(huì)分別緩存
      • 示例:/foo/1//foo/23/會(huì)被分別緩存
      urlpatterns = [
          path("foo/<int:code>/", my_view),
      ]
      

      自定義緩存前綴:可以為不同視圖設(shè)置不同的緩存前綴

      @cache_page(60 * 15, key_prefix="site1")
      def my_view(request):
          ...
      

      在 URLconf 中配置緩存

      from django.views.decorators.cache import cache_page
      
      urlpatterns = [
          path("foo/<int:code>/", cache_page(60 * 15)(my_view)),
      ]
      

      三、緩存API詳解

      當(dāng)需要更精細(xì)的緩存控制時(shí),可以使用 Django 提供的緩存 API,直接操作緩存中的數(shù)據(jù)。

      導(dǎo)入緩存模塊

      from django.core.cache import cache
      

      基本操作

      設(shè)置緩存

      # 語(yǔ)法:cache.set(key, value, timeout=默認(rèn)超時(shí), version=None)
      cache.set('my_key', 'hello, world!', 30)  # 緩存30秒
      

      獲取緩存

      # 語(yǔ)法:cache.get(key, default=None, version=None)
      value = cache.get('my_key')  # 獲取緩存值,如果不存在返回None
      value = cache.get('my_key', 'default_value')  # 指定默認(rèn)值
      

      新增緩存(僅當(dāng)鍵不存在時(shí))

      # 如果鍵不存在則添加,返回布爾值表示是否成功
      success = cache.add("add_key", "Initial value")
      

      獲取或設(shè)置緩存

      # 如果鍵存在則獲取,否則設(shè)置并返回默認(rèn)值
      value = cache.get_or_set("my_new_key", "my new value", 100)
      

      刪除緩存

      # 刪除指定鍵,返回布爾值表示是否成功
      success = cache.delete("a")
      

      更新緩存過(guò)期時(shí)間

      # 為已有鍵設(shè)置新的過(guò)期時(shí)間
      success = cache.touch("a", 10)  # 新超時(shí)時(shí)間10秒
      

      四、緩存實(shí)戰(zhàn)

      場(chǎng)景說(shuō)明

      RBAC(Role-Based Access Control,基于角色的訪問(wèn)控制)是一種廣泛使用的權(quán)限管理模型。在 Django+Vue 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng)中,一般采用RBAC權(quán)限策略。使用緩存機(jī)制,避免重復(fù)計(jì)算用戶權(quán)限標(biāo)識(shí)集合

      寫(xiě)入緩存

      用戶成功登錄后,前端自動(dòng)調(diào)用獲取登錄用戶的權(quán)限信息接口,獲取登錄用戶的權(quán)限信息,包括

      • 用戶基本信息 user
      • 用戶角色集合 roles
      • 用戶權(quán)限標(biāo)識(shí)集合 permissions
      • 用戶樹(shù)狀菜單集合 menus

      將計(jì)算后的上述權(quán)限信息,寫(xiě)入Redis緩存。同時(shí)返回給前端,生成動(dòng)態(tài)菜單。

      @extend_schema(tags=["管理后臺(tái)-system-認(rèn)證"])
      class AuthViewSet(viewsets.GenericViewSet):
          serializer_class = AuthLoginSerializer
          queryset = SystemUsers.objects.none()
      
          @extend_schema(summary="獲取登錄用戶的權(quán)限信息")
          @action(methods=["get"], detail=False, url_path="get-permission-info")
          def get_permission_info(self, request, *args, **kwargs):
              """獲取登錄用戶的權(quán)限信息"""
              user_id = request.user.id
              cache_key = f"system_users_{user_id}"
              user = SystemUsers.objects.prefetch_related("roles", "roles__menus").get(
                  id=user_id
              )
              serializer = AuthPermissionInfoSerializer(user, context={"request": request})
              cache.set(cache_key, serializer.data, timeout=None)
              return CommonResponse.success(data=serializer.data)
      

      image-20250728143531737

      讀取緩存

      用戶執(zhí)行某個(gè)API接口時(shí),會(huì)進(jìn)行權(quán)限判斷。后端權(quán)限判斷時(shí),會(huì)從緩存中讀取當(dāng)前請(qǐng)求用戶的權(quán)限標(biāo)識(shí)集合,然后對(duì)比本次請(qǐng)求的權(quán)限標(biāo)識(shí)(如 "system:post:query")。如果包含在集合中,則返回true,否則返回false。

      image-20250623113039283

      點(diǎn)擊查看RBAC權(quán)限原理

      刪除緩存

      當(dāng)用戶退出登錄時(shí),刪除用戶的緩存信息

          @extend_schema(summary="登出系統(tǒng)")
          @action(
              methods=["post"],
              detail=False,
              url_path="logout",
              permission_classes=[AllowAny],
          )
          def logout(self, request, *args, **kwargs):
              """登出系統(tǒng)"""
              cache.delete(f"system_users_{request.user.id}")  # 清空用戶Redis
              # ... 
      

      點(diǎn)擊查看完整代碼


      您正在閱讀的是《Django從入門(mén)到實(shí)戰(zhàn)》專欄!關(guān)注不迷路~

      posted @ 2025-07-28 15:34  小王子1024  閱讀(209)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 中文有码字幕日本第一页| 亚洲国产成人av国产自| 在线无码av一区二区三区| 神马久久亚洲一区 二区| 国产内射性高湖| 亚欧洲乱码视频一二三区| 亚洲国产美女精品久久久| 国产精品三级中文字幕| 久久日产一线二线三线| 国产视频不卡一区二区三区| 亚洲国产成人久久综合三区| 欧美不卡无线在线一二三区观| 国产农村老熟女国产老熟女| 国产亚洲精品第一综合另类灬| 永久免费av网站可以直接看的| 少妇无码av无码专区在线观看| 九九热在线视频精品免费| 好吊视频一区二区三区| 日韩人妻无码一区二区三区99| 国产精品色内内在线播放| 国产最新精品系列第三页| 性色欲情网站| 人妻系列中文字幕精品| 久久精品99国产精品日本| 日日噜噜夜夜狠狠视频| 亚洲乱人伦中文字幕无码| 国产精品男女午夜福利片| 无码高潮爽到爆的喷水视频app| 亚洲一区二区三区播放| 国产国拍精品av在线观看| 91精品91久久久久久| 国产一二三五区不在卡| 999精品视频在线| 成年男女免费视频网站| 国产在线精品中文字幕| 精品不卡一区二区三区| 成人国产精品一区二区网站公司| 国产亚洲999精品aa片在线爽| 国产av一区二区午夜福利| 久久精品国产字幕高潮| 亚洲精品一区久久久久一品av|