django中的緩存以及跨域

django中的緩存

先來了解如下問題👇(面試會問)css

如何提升網站的併發量:
QPS:Queries Per Second意思是「每秒查詢率」,是一臺服務器每秒可以相應的查詢次數,是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準。
TPS:是TransactionsPerSecond的縮寫,也就是事務數/秒。它是軟件測試結果的測量單位。一個事務是指一個客戶機向服務器發送請求而後服務器作出反應的過程。客戶機在發送請時開始計時,收到服務器響應後結束計時,以此來計算使用的時間和完成的事務個數
  使用cdn(靜態文件放在別人的服務器,減小你的服務器的壓力)
圖片防盜鏈
-請求頭裏有refer,標誌的從哪一個地方跳到我這裏來的,計算引流(我這個網站給你這個網站作了膏,從我網站一點就跳到你網站去,它就會攜帶refer信息,人家一統計你這個網站是跳到我這個網站來的,說明你給我引了流量過來的,我須要給你付費)
-nginx處理
-精靈圖:一個頁面有十個小圖就得發十個請求,它就將十個小圖拼成一個圖發一個請求,而後根據個人定位,給我定到一個地方,因此你看到的是就是顯示的圖
-頁面本地緩存(請求次數減小)
-nginx作負載均衡,後臺服務作集羣化的部署
-後臺緩存(django中的緩存)
-數據庫的主從同步
-讀寫分離
-異步處理(celery:分佈式的異步任務框架)

一 緩存介紹

在動態網站中,用戶全部的請求,服務器都會去數據庫中進行相應的增,刪,查,改,渲染模板,執行業務邏輯,最後生成用戶看到的頁面.html

當一個網站的用戶訪問量很大的時候,每一次的的後臺操做,都會消耗不少的服務端資源,因此必須使用緩存來減輕後端服務器的壓力.python

緩存是將一些經常使用的數據保存內存或者memcache中,在必定的時間內有人來訪問這些數據時,則再也不去執行數據庫及渲染等操做,而是直接從內存或memcache的緩存中去取得數據,而後返回給用戶.mysql

二 Django中的6種緩存方式

  • 開發調試緩存:沒有緩存
  • 內存緩存
  • 文件緩存
  • 數據庫緩存
  • Memcache緩存(使用python-memcached模塊)
  • Memcache緩存(使用pylibmc模塊)
  • 緩存到redis

常常使用的有文件緩存和Mencache緩存jquery

 

1.2.3 文件緩存(把緩存數據存儲在文件中)nginx

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)
  }
 }   
}
View Code

1.2.4 數據庫緩存(把緩存數據存儲在數據庫中)redis

settings.py文件配置sql

CACHES = {
 'default': {
  'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定緩存使用的引擎
  'LOCATION': 'cache_table',          # 數據庫表    
  'OPTIONS':{
   'MAX_ENTRIES': 300,           # 最大緩存記錄的數量(默認300)
   'CULL_FREQUENCY': 3,          # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)
  }  
 }   
}
View Code

注意,建立緩存的數據庫表使用的語句:數據庫

python manage.py createcachetable
-緩存位置的配置(在setting中配置,BACKEND不一樣,緩存的位置不一樣):
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定緩存使用的引擎
'LOCATION': 'D:\lqz\cache', # 指定緩存的路徑
'TIMEOUT': 300, # 緩存超時時間(默認爲300秒,None表示永不過時)
'OPTIONS': {
'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300)
'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)
}
}
}

-緩存粒度

-全站緩存
-單頁面緩存
-局部緩存


單頁面緩存🎆
views.py
from django.shortcuts import render

# Create your views here.

from django.views.decorators.cache import cache_page
import time

@cache_page(5)
def index(request):
    ctime = time.time()
    return render(request, 'index.html',{'time':ctime})
 

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

    <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>

    <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
</head>
<body>
{{ time }}
</body>
</html>

url.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/',views.index)
]
-緩存使用: 
-1 配置setting文件,把cache配置進去
-2 單頁面緩存:在視圖函數上加一個裝飾器
from django.views.decorators.cache import cache_page
@cache_page(5) 5 表明緩存時間

局部緩存💥
from django.shortcuts import render

# Create your views here.

from django.views.decorators.cache import cache_page
import time

@cache_page(5)
def index(request):
    ctime = time.time()
    return render(request, 'index.html',{'time':ctime})
views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>

    <link href="https://cdn.bootcss.com/font-awesome/5.8.2/css/fontawesome.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/font-awesome/5.8.2/js/fontawesome.min.js"></script>

    <link href="https://cdn.bootcss.com/sweetalert/1.1.3/sweetalert.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/sweetalert/2.1.2/sweetalert.min.js"></script>
</head>
<body>
{% load cache %}
{% cache 5 'test' %}
當前時間{{ time }}
{% endcache %}
</body>
</html>
index.html
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/',views.index)
]
urls.py
- 局部緩存
{% load cache %}
{% cache 5 'test'%} 第一個參數表示緩存時間,第二個參數是key值(取緩存的時候,須要根據key值取)
當前時間:{{ time }}
{% endcache %}
全站緩存🎡

既然是全站緩存,固然要使用Django中的中間件.

用戶的請求經過中間件,通過一系列的認證等操做,若是請求的內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容並返回給用戶

當返回給用戶以前,判斷緩存中是否已經存在,若是不存在,則UpdateCacheMiddleware會將緩存保存至Django的緩存之中,以實現全站緩存

 
緩存整個站點,是最簡單的緩存方法

在 MIDDLEWARE_CLASSES 中加入 「update」 和 「fetch」 中間件
MIDDLEWARE_CLASSES = (
    ‘django.middleware.cache.UpdateCacheMiddleware’, #第一
    'django.middleware.common.CommonMiddleware',
    ‘django.middleware.cache.FetchFromCacheMiddleware’, #最後
)
「update」 必須配置在第一個
「fetch」 必須配置在最後一個
 

修改settings.py配置文件

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',   #響應HttpResponse中設置幾個headers
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',   #用來緩存經過GET和HEAD方法獲取的狀態碼爲200的響應

)


CACHE_MIDDLEWARE_SECONDS=10
View Code

視圖函數:

from django.views.decorators.cache import cache_page
import time
from .models import *


def index(request):

     t=time.time()      #獲取當前時間
     bookList=Book.objects.all()
     return render(request,"index.html",locals())

def foo(request):
    t=time.time()      #獲取當前時間
    return HttpResponse("HELLO:"+str(t))

模板(index.html):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3 style="color: green">當前時間:-----{{ t }}</h3>

<ul>
    {% for book in bookList %}
       <li>{{ book.name }}--------->{{ book.price }}$</li>
    {% endfor %}
</ul>

</body>
</html>

其他代碼不變,刷新瀏覽器是10秒,頁面上的時間變化一次,這樣就實現了全站緩存.

test是幹啥用的:根據key值來取,一個頁面有十個緩存,全叫test能夠嗎?這就全都亂套了,在局部緩存,沒寫這個key,那是根據什麼來的,我這裏沒有存值,而緩存必定會有key對應的字符串 ,就是根據路由 
- 高級用法
Create your views here.
from rest_framework.views import APIView
from app01.utils import MyRespone
class Test(APIView):
    def get(self,request):
        response=MyRespone()
        response.data={'name':'lqz','age':18}
        response.code=100
        response.msg='查詢成功'
        return response.get_response()
views.py
from rest_framework.response import Response
class MyRespone():
    def __init__(self):
        self.code=100
        self.msg=None

    def get_response(self):
        return Response(self.__dict__)
utils.py
將以上的response.data取值方式改成如下
-先後端分離項目(保存數據,序列化以後的data)
-設置值跟取值:
cache.set('test_data',{'name':'lqz','age':18},5)
cache.get('test_data')
 

 

跨域問題

-瀏覽器的:同源策略,瀏覽器拒毫不是當前域域返回的數據
-ip地址和端口號都相同纔是同一個域
-如何解決:
-CORS:跨域資源共享
-簡單請求:發一次請求
-非簡單請求:非簡單請求是發送了兩次請求,第一次是預檢請求(OPTIONS請求),當預檢經過,容許我發請求,再發送真實的請求
-解決跨域問題:(寫好這個中間件配置一下)
class MyCorsMiddle(MiddlewareMixin):
def process_response(self, request, response):
if request.method == 'OPTIONS':
# 容許它
response['Access-Control-Allow-Headers'] = 'Content-Type'
# obj['Access-Control-Allow-Headers']='*'

# obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000'
response['Access-Control-Allow-Origin'] = '*'
return response
-別人寫的cors-headers(瞭解一下)

redis的安裝和簡單使用

-內存數據庫   -Redis-x64-3.2.100---》mysql   -redis-desktop-manager-0.9.3.817----》navcate-安裝完後   -redis-server  服務端   -redis-cli   客戶端
相關文章
相關標籤/搜索