內置的版本控制類html
from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioningpython
基於url的get傳參方式:QueryParameterVersioning 如:/user?version=v1mysql
基於url的正則方式:URLPathVersioning /v1/user/web
基於accept請求頭方式:AcceptHeaderVersioning Accept:application/json;version=1redis
基於主機名方法:HostNameVersioning v1.example.comsql
基於django路由系統的namespace:NamespaceVersioning example.com/v1/users/mongodb
在CBV類中加入數據庫
versioning_class = URLPathVersioningdjango
REST_FRAMEWORK = {'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',json
'DEFAULT_VERSION':'v1', 默認版本(request中沒法取到)
'ALLOWED_VERSIONS':['v1','v2'], (容許的版本)
'VERSION_PARAM':'version'} URL中獲取值的key
基於正則的方式:
from django.conf.urls import url,include
from web.views import TestView
urlpatterns = [ url(r'^(?P<version>[v1|v2]+)/test/',TestView.as_view(),name='test'),]
獲取版本: request.version
獲取版本管理的類: request.versioning_scheme
執行determine_version,返回兩個值,放到request對象裏
version,scheme =self.determine_version(request,*args,**kwargs)
request.version,request.versioning_scheme = version,scheme
def determine_version(self,request,*args,**kwargs):
if self.versioning_class is None:
return (None,None)
scheme =self.versioning_class()
return (scheme.determine_version(request,*args,**kwargs),scheme)
爲了提升網站併發量
三種粒度;
全站緩存,單頁面緩存,頁面中佈局緩存
django中使用緩存
CACHE= {'default':{'BACKEND':'django.core.cache.backends.filebased.FileBaedCache',指定緩存使用的引擎
'LOCATION':'/var/tmp/django_cache', 指定緩存的路徑
'TIMEOUT':300, 緩存超時時間(默認爲300秒,None表示永不過時)
'OPTIONS':{'MAX_ENTRIES':300,'CULL_FREQUENCY':3,}}} 最大緩存的數量300, 緩存到達最大個數以後,剔除緩存個數的比例
使用單頁面緩存(使用裝飾器):
from django.views.decorators.cache import cache_page
@cache_page(5)
def cache_test(request):
ctime = time.time()
return render(request,'index.html',locals())
頁面局部緩存
{% load cache %}
第一個參數是超時時間,第二個參數是key值,惟一的標誌
{% cache 5 'tt' %}
{{ ctime }}
{% endcache %}
全站緩存:配置中間件
配置兩個中間件:
django.middleware.cache.UpdateCacheMiddleware'...
django.middleware.cache.FetchFromCacheMiddleware'
配置緩存時間
CACHE_MIDDLEWARE_SECONDS=10
緩存存儲的數據格式
unique-snowflake={index:regre}
跨域問題
同源策略
瀏覽器基本的安全策略
當前頁面只能朝當前域的地址發送請求
不一樣的域:ip+端口+協議 都相同纔是同一個域
CORS 跨域資源共享
簡單請求和非簡單請求
只要符合如下兩條,就是簡單請求,不然就是費簡單請求
(1):請求方法是如下三種之一
HEAD,GET,POST
(2):HTTP的頭信息不超出如下幾種字段:
Accept Accept-Language Content-Language Last-Event-ID
Content-Type:只限於三個值application/x-www-form-urlencoded,multipart/form-data,text.plain
簡單請求只發一次請求
費簡單請求發兩次:一次是OPTIONS預檢請求,預檢經過再發第二次真實請求,
之後處理跨域問題(可使用第三方的django-cors-headers):
寫一箇中間件:
class MyMiddleware(MiddlewareMixin):
def process_response(self,request,response):
response['Access-Control-Allow-origin']='*'
if request.method == 'OPTIONS':
response['Access-Control-Allow-Headers'] = '*'
response['Access-Control-Allow-Methods']="*"
return response
在settings中配置
mysql,oracle:關係型數據庫
redis,mongodb:菲關係型數據庫/nosql
redis存儲在內存內 mongodb存儲到硬盤上
redis通常用來作:
作緩存
session數據
遊戲排行榜
對速度要求比較高的數據的存儲
作消息隊列
redis是key-value的存儲,支持持久化,類字典,有五大數據類型:\
字符串:
列表:
字典:
集合:
有序集合:
redis = { k1:'123',字符串,可:[1,2,3]列表,k3:{1,2,3}集合,k4:{name:lqz,age:12}字典/hash表,k5:{('lqz',18),('egon',33)有序集合}}
redis支持五大數據類型 redis支持持久化,單進程,單線程,速度很是快
Memcached不能持久化,只支持字符串
python操做redis
安裝redis模塊
快速使用
import redis
conn = redis.Redis(host='127.0.0.1',port=6379)
name=conn.get('name')
首先新建模塊
import redis
POOL = redis.ConnectionPool(host='127.0.0.1',port=6379.max_connections=1000)
使用鏈接池
from conn_pool import POOL
conn = redis.Redis(connection_pool=POOL)
Django中的6中緩存方式
開發者調試緩存
內存緩存
文件緩存
數據庫緩存
Memcached緩存(使用python-memcache模塊)
Memcache緩存(使用pylibmc模塊)
1 CACHES = { 2 'default': { 3 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', # 指定緩存使用的引擎 4 'LOCATION': 'unique-snowflake', # 寫在內存中的變量的惟一值 5 'TIMEOUT':300, # 緩存超時時間(默認爲300秒,None表示永不過時) 6 'OPTIONS':{ 7 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 8 'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) 9 } 10 } 11 }
1 CACHES = { 2 'default': { 3 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定緩存使用的引擎 4 'LOCATION': '/var/tmp/django_cache', #指定緩存的路徑 5 'TIMEOUT':300, #緩存超時時間(默認爲300秒,None表示永不過時) 6 'OPTIONS':{ 7 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 8 'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) 9 } 10 } 11 }
1 CACHES = { 2 'default': { 3 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 指定緩存使用的引擎 4 'LOCATION': 'cache_table', # 數據庫表 5 'OPTIONS':{ 6 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 7 'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) 8 } 9 } 10 } 11 注意,建立緩存的數據庫表使用的語句: 12 13 python manage.py createcachetable
Memcached是Django原生支持的緩存系統.要使用Memcached,須要下載Memcached的支持庫python-memcached或pylibmc. settings.py文件配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定緩存使用的引擎 'LOCATION': '192.168.10.100:11211', # 指定Memcache緩存服務器的IP地址和端口 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) } } } LOCATION也能夠配置成以下: 'LOCATION': 'unix:/tmp/memcached.sock', # 指定局域網內的主機名加socket套接字爲Memcache緩存服務器 'LOCATION': [ # 指定一臺或多臺其餘主機ip地址加端口爲Memcache緩存服務器 '192.168.10.100:11211', '192.168.10.101:11211', '192.168.10.102:11211', ]
1 視圖: 2 3 複製代碼 4 from django.views.decorators.cache import cache_page 5 import time 6 from .models import * 7 8 @cache_page(15) #超時時間爲15秒 9 def index(request): 10 t=time.time() #獲取當前時間 11 bookList=Book.objects.all() 12 return render(request,"index.html",locals()) 13 複製代碼 14 模板(index.html): 15 16 複製代碼 17 <!DOCTYPE html> 18 <html lang="en"> 19 <head> 20 <meta charset="UTF-8"> 21 <title>Title</title> 22 </head> 23 <body> 24 <h3>當前時間:-----{{ t }}</h3> 25 26 <ul> 27 {% for book in bookList %} 28 <li>{{ book.name }}--------->{{ book.price }}$</li> 29 {% endfor %} 30 </ul> 31 32 </body> 33 </html> 34 複製代碼 35 上面的例子是基於內存的緩存配置,基於文件的緩存該怎麼配置呢?? 36 37 更改settings.py的配置 38 39 複製代碼 40 CACHES = { 41 'default': { 42 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定緩存使用的引擎 43 'LOCATION': 'E:\django_cache', # 指定緩存的路徑 44 'TIMEOUT': 300, # 緩存超時時間(默認爲300秒,None表示永不過時) 45 'OPTIONS': { 46 'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300) 47 'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) 48 } 49 } 50 } 51 複製代碼 52 而後再次刷新瀏覽器,能夠看到在剛纔配置的目錄下生成的緩存文件 53 54 經過實驗能夠知道,Django會以本身的形式把緩存文件保存在配置文件中指定的目錄中. 55 56 4.2 全站使用緩存 57 既然是全站緩存,固然要使用Django中的中間件. 58 59 用戶的請求經過中間件,通過一系列的認證等操做,若是請求的內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容並返回給用戶 60 61 當返回給用戶以前,判斷緩存中是否已經存在,若是不存在,則UpdateCacheMiddleware會將緩存保存至Django的緩存之中,以實現全站緩存 62 63 複製代碼 64 緩存整個站點,是最簡單的緩存方法 65 66 在 MIDDLEWARE_CLASSES 中加入 「update」 和 「fetch」 中間件 67 MIDDLEWARE_CLASSES = ( 68 ‘django.middleware.cache.UpdateCacheMiddleware’, #第一 69 'django.middleware.common.CommonMiddleware', 70 ‘django.middleware.cache.FetchFromCacheMiddleware’, #最後 71 ) 72 「update」 必須配置在第一個 73 「fetch」 必須配置在最後一個 74 複製代碼 75 修改settings.py配置文件 76 77 78 複製代碼 79 MIDDLEWARE_CLASSES = ( 80 'django.middleware.cache.UpdateCacheMiddleware', #響應HttpResponse中設置幾個headers 81 'django.contrib.sessions.middleware.SessionMiddleware', 82 'django.middleware.common.CommonMiddleware', 83 'django.middleware.csrf.CsrfViewMiddleware', 84 'django.contrib.auth.middleware.AuthenticationMiddleware', 85 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 86 'django.contrib.messages.middleware.MessageMiddleware', 87 'django.middleware.clickjacking.XFrameOptionsMiddleware', 88 'django.middleware.security.SecurityMiddleware', 89 'django.middleware.cache.FetchFromCacheMiddleware', #用來緩存經過GET和HEAD方法獲取的狀態碼爲200的響應 90 91 ) 92 93 94 CACHE_MIDDLEWARE_SECONDS=10 95 複製代碼 96 視圖函數: 97 98 複製代碼 99 from django.views.decorators.cache import cache_page 100 import time 101 from .models import * 102 103 104 def index(request): 105 106 t=time.time() #獲取當前時間 107 bookList=Book.objects.all() 108 return render(request,"index.html",locals()) 109 110 def foo(request): 111 t=time.time() #獲取當前時間 112 return HttpResponse("HELLO:"+str(t)) 113 複製代碼 114 模板(index.html): 115 116 複製代碼 117 <!DOCTYPE html> 118 <html lang="en"> 119 <head> 120 <meta charset="UTF-8"> 121 <title>Title</title> 122 </head> 123 <body> 124 <h3 style="color: green">當前時間:-----{{ t }}</h3> 125 126 <ul> 127 {% for book in bookList %} 128 <li>{{ book.name }}--------->{{ book.price }}$</li> 129 {% endfor %} 130 </ul> 131 132 </body> 133 </html> 134 複製代碼 135 其他代碼不變,刷新瀏覽器是10秒,頁面上的時間變化一次,這樣就實現了全站緩存. 136 137 4.3局部視圖緩存 138 例子,刷新頁面時,整個網頁有一部分實現緩存 139 140 views視圖函數 141 142 複製代碼 143 from django.views.decorators.cache import cache_page 144 import time 145 from .models import * 146 def index(request): 147 t=time.time() #獲取當前時間 148 bookList=Book.objects.all() 149 return render(request,"index.html",locals()) 150 複製代碼 151 模板(index.html): 152 153 複製代碼 154 {% load cache %} 155 <!DOCTYPE html> 156 <html lang="en"> 157 <head> 158 <meta charset="UTF-8"> 159 <title>Title</title> 160 </head> 161 <body> 162 <h3 style="color: green">不緩存:-----{{ t }}</h3> 163 164 {% cache 2 'name' %} 165 <h3>緩存:-----:{{ t }}</h3> 166 {% endcache %} 167 168 </body> 169 </html>
1 string操做,redis中的string在內存中按照一個name對應一個value來存儲 2 setname,value,ex=None,px=False,xx=False) 3 在Redis中設置值,默認,不存在則建立,存在則修改 4 參數: 5 ex:過時時間(秒) 6 px:過時時間(毫秒) 7 nx:若是設置爲True,則只有name不存在時,當前set操做才執行,只存在就修改不了,執行沒效果 8 xx:若是設置爲True,則只有name存在時,當前set操做才執行,值存在才能修改,值不存在不會設置新值 9 setnx(name,value) 10 設置值,只有name不存在時,執行設置操做(添加),若是存在,不會修改 11 setex(name,value,time) 12 設置值,參數:time過時時間(數字秒,或timedelta對象) 13 psetex(name,time_ms,value) 14 設置值 參數:time_ms過時時間(數字毫秒) 15 mset(*args,**kwargs) 16 批量設置值 如:mset(k1='v1',k2='v2')或mget({'k1':'v1','k2':'v2'}) 17 get(name) 18 獲取值 19 mget(key,*args) 20 批量獲取 mget('k1','k2') 或 mget(['k3','k4']) 21 getset(name,value) 22 設置新值並獲取原來的值 23 getrange(key,start,end) 24 獲取子序列(根據字節獲取,非字符) 25 參數:start:起始位置 end 結束位置 26 setrange(name, offset, value) 27 28 # 修改字符串內容,從指定字符串索引開始向後替換(新值太長時,則向後添加) 29 # 參數: 30 # offset,字符串的索引,字節(一個漢字三個字節) 31 # value,要設置的值 32 strlen(name) 33 34 # 返回name對應值的字節長度(一個漢字3個字節) 35 incr(self, name, amount=1) 36 37 複製代碼 38 # 自增 name對應的值,當name不存在時,則建立name=amount,不然,則自增。 39 40 # 參數: 41 # name,Redis的name 42 # amount,自增數(必須是整數) 43 44 # 注:同incrby 45 複製代碼 46 incrbyfloat(self, name, amount=1.0) 47 48 # 自增 name對應的值,當name不存在時,則建立name=amount,不然,則自增。 49 50 # 參數: 51 # name,Redis的name 52 # amount,自增數(浮點型) 53 decr(self, name, amount=1) 54 55 # 自減 name對應的值,當name不存在時,則建立name=amount,不然,則自減。 56 57 # 參數: 58 # name,Redis的name 59 # amount,自減數(整數) 60 append(key, value) 61 62 63 64 # 在redis name對應的值後面追加內容 65 66 # 參數: 67 key, redis的name 68 value, 要追加的字符串