一、django快取
1.快取位置
快取的地方: 1 記憶體中 2 檔案中(硬碟上) 3 資料庫快取(硬碟上) 4 redis中(后期都用它,記憶體上,更快) 5 通過配置,設定快取位置 -以檔案快取為例,在settings.py中配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定快取使用的引擎 'LOCATION': '/var/tmp/django_cache', #指定快取的路徑 'TIMEOUT':300, #快取超時時間(默認為300秒,None表示永不過期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大快取記錄的數量(默認300) 'CULL_FREQUENCY': 3, # 快取到達最大個數之后,剔除快取個數的比例,即:1/CULL_FREQUENCY(默認3) } } }
2.快取粒度
#這里說的是前后端混合開發的快取 1 三種粒度:整站快取,單頁面快取,區域快取 ps:時間越長級別越高,快取就用級別高的 2 單頁面快取(用的多) from django.views.decorators.cache import cache_page @cache_page(5) def index(request): import time ctime=time.time() return render(request,'index.html',context={'ctime':ctime}) 3 頁面中某個位置快取(區域快取) # 快取3s鐘,xxx是唯一key,唯一的 {% load cache %} {% cache 3 'xxx'%} 這一部分用快取 時間為:{{ ctime }} {% endcache %} 4 整站快取(兩個中間件)(用的少) # 在setting中配置 ‘django.middleware.cache.UpdateCacheMiddleware’, #第一,重寫了process_response ',,,', ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后,重寫了process_requset # 快取過期時間 CACHE_MIDDLEWARE_SECONDS=5
3.前后端分離后快取使用
1 查出一堆json格式資料,鏈表查了8個表 2 前后端分離以后, -只需要會如何是把字典,字串,物件放到快取中, -如何取出來 4 具體使用 #models.py Book表并進行資料遷移 #views.py----這個可以就是模板,哪里需要隨便拿著用 from django.core.cache import cache class BookView(APIView): def get(self, request): res_data = cache.get('book_list_dix',) if res_data: # 有快取,直接回傳 print('走了快取') return Response(res_data) else: # 沒有快取,再走資料庫 book_list = models.Book.objects.all() ser = serializer.BookSer(book_list, many=True) # 想把ser.data快取起來 cache.set('book_list_dix', ser.data,100) print('沒走快取') return Response(ser.data) #serializer.py from app01 import models from rest_framework import serializers class BookSer(serializers.ModelSerializer): class Meta: model=models.Book fields='__all__' #urls.py path('books/', views.BookView.as_view()), 5 cache可以快取所有資料型別,包括自定義的類(pickle)
二、django信號
1 Django提供一種信號機制,當發生一些動作的時候,發出信號,然后監聽了這個信號的函式就會執行 2 Django內置信號 Model signals pre_init # django的modal執行其構造方法前,自動觸發 post_init # django的modal執行其構造方法后,自動觸發 pre_save # django的modal物件保存前,自動觸發 post_save # django的modal物件保存后,自動觸發 pre_delete # django的modal物件洗掉前,自動觸發 post_delete # django的modal物件洗掉后,自動觸發 m2m_changed # django的modal中使用m2m欄位操作第三張表(add,remove,clear)前后,自動觸發 class_prepared # 程式啟動時,檢測已注冊的app中modal類,對于每一個類,自動觸發 Management signals pre_migrate # 執行migrate命令前,自動觸發 post_migrate # 執行migrate命令后,自動觸發 Request/response signals request_started # 請求到來前,自動觸發 request_finished # 請求結束后,自動觸發 got_request_exception # 請求例外后,自動觸發 Test signals setting_changed # 使用test測驗修改組態檔時,自動觸發 template_rendered # 使用test測驗渲染模板時,自動觸發 Database Wrappers connection_created # 創建資料庫連接時,自動觸發 3 內置信號的使用(兩種方式) # #1 匯入內置信號 # from django.core.signals import request_started # #2 寫一個函式 # def aa(sender, **kwargs): # print(sender) # print(kwargs) # print('請求來了,我寫日志了,,,') # # # #3 跟內置信號系結 # request_started.connect(aa) # 方式二 from django.core.signals import request_started,request_finished from django.dispatch import receiver @receiver(request_finished) # 內置信號pre_save和my_callback函式系結了 def my_callback(sender, **kwargs): print("請zzou了,走了我") 4 信號的應用場景: -記錄日志(物件創建就寫入日志) -解耦合
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/227334.html
標籤:架構設計
