drf——django的緩存和信號

1、django緩存

1.緩存位置html

緩存的地方:
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.緩存粒度redis

#這裏說的是先後端混合開發的緩存
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)

2、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 信號的應用場景:
        -記錄日誌(對象建立就寫入日誌)
        -解耦合
    
相關文章
相關標籤/搜索