django中的缓存以及跨域
django中的緩存
先來了解以下問題?(面試會問)
如何提高網站的并發量:QPS:Queries Per Second意思是“每秒查詢率”,是一臺服務器每秒能夠相應的查詢次數,是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準。
TPS:是TransactionsPerSecond的縮寫,也就是事務數/秒。它是軟件測試結果的測量單位。一個事務是指一個客戶機向服務器發送請求然后服務器做出反應的過程。客戶機在發送請時開始計時,收到服務器響應后結束計時,以此來計算使用的時間和完成的事務個數
使用cdn(靜態文件放在別人的服務器,減少你的服務器的壓力)
圖片防盜鏈
-請求頭里有refer,標志的從哪個地方跳到我這里來的,計算引流(我這個網站給你這個網站做了膏,從我網站一點就跳到你網站去,它就會攜帶refer信息,人家一統計你這個網站是跳到我這個網站來的,說明你給我引了流量過來的,我需要給你付費)
-nginx處理
-精靈圖:一個頁面有十個小圖就得發十個請求,它就將十個小圖拼成一個圖發一個請求,然后根據我的定位,給我定到一個地方,所以你看到的是就是顯示的圖
-頁面本地緩存(請求次數減少)
-nginx做負載均衡,后臺服務做集群化的部署
-后臺緩存(django中的緩存)
-數據庫的主從同步
-讀寫分離
-異步處理(celery:分布式的異步任務框架)
一 緩存介紹
在動態網站中,用戶所有的請求,服務器都會去數據庫中進行相應的增,刪,查,改,渲染模板,執行業務邏輯,最后生成用戶看到的頁面.
當一個網站的用戶訪問量很大的時候,每一次的的后臺操作,都會消耗很多的服務端資源,所以必須使用緩存來減輕后端服務器的壓力.
緩存是將一些常用的數據保存內存或者memcache中,在一定的時間內有人來訪問這些數據時,則不再去執行數據庫及渲染等操作,而是直接從內存或memcache的緩存中去取得數據,然后返回給用戶.
二 Django中的6種緩存方式
- 開發調試緩存:沒有緩存
- 內存緩存
- 文件緩存
- 數據庫緩存
- Memcache緩存(使用python-memcached模塊)
- Memcache緩存(使用pylibmc模塊)
- 緩存到redis
經常使用的有文件緩存和Mencache緩存
?
1.2.3 文件緩存(把緩存數據存儲在文件中)
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 Code1.2.4 數據庫緩存(把緩存數據存儲在數據庫中)
settings.py文件配置
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=100response.msg='查詢成功'return response.get_response() views.py from rest_framework.response import Response class MyRespone():def __init__(self):self.code=100self.msg=Nonedef 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 客戶端
?
轉載于:https://www.cnblogs.com/huangxuanya/p/11157531.html
總結
以上是生活随笔為你收集整理的django中的缓存以及跨域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫画:IT大牛养成记?
- 下一篇: 检测数据类型