把最近用到的臨時資料傳遞總結下
先說下對我來說會怎麼選,cookie會用理解就行,我不常用,因為用戶會關閉cookie,而且需要隨著HttpResponse傳遞,有局限性
session的話也是,在配置時就不選擇根據cookie,按照系統默認的數據庫就好了
cache放到記憶體裡,用起來方便也簡單,就是佔記憶體....,也可以放到庫裡,根據實際情況考慮吧
下面就是這三種方法的配置和使用了
一: cookie
取得cookie
#HttpRequest.COOKIES
#回傳一個標準的字典
#包含所有的cookie,鍵值都是str
儲存cookie
#HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
max_age 以秒設定為單位儲存的長度,當為None時,時長與客戶端同步
domain 設定一個跨域的cookie
domain=".lawrence.com" 將設定一個www.lawrence.com、blogs .lawrence.com 和calendars.lawrence.com 都可讀的Cookie。不會報錯,但是沒有測試是否真的可以跨站
httponly=False 當設定為True時阻止客戶端的
js_cookie(key, path='/', domain=None)刪除key指定的cookie,當該cookie不存在時什麼也不會發生
當set_cookie指定了path與domain時刪除時應保持一致,否則不會刪除
在一個view中設定的cookie需要傳遞到下個view才能使用,如:
view1: res = HttpResponseRedirect(revers("namespace:name") res.set_cookie('key_set', 'value_set_view1', 60) # 在这里是没办法获取不到现在的这个cookie print(request.COOKIES) # 直接设置COOKIES COOKIES['key_dict'] = 'values_dict' # 这里可以看到上面设置的内容 print(request.COOKIES) return res view2: 假设上面的Response就是指向这里的 print(request.COOKIES) # 这里可以看到上面通过set设置的 key_set ,但是通过字典设置的key_dict就没有了
二: 使用session
在中間件插件集中添加
django.contrib.sessions.middleware.SessionMiddlewaredjango1.10為MIDDLEWARE,1.08為MIDDLEWARE_CLASSES
並且INSTALLED_APPS中應有'django.contrib.sessions'.##並且INSTALLED_APPS中應有'django.contrib.sessions'.
##可以將session設定為基於cookie,檔案,記憶體,資料庫 基於資料庫,將'django.contrib.sessions' 新增到INSTALLED_APPS中否則的話不如直接使用快取,靈活度更高,負載更小
SESSION_ENGINE 直接設定在setting.py的最外層即可
# setting.py
SESSION_ENGINE = “django.contrib.sessions.backends.file"
使用會話
#Session 的基底類別
backends.base.SessionBase
在view中取得session
request.session 取得一個標準的類別字典
#方法也與字典相同(不使用私有方法)
session['fav_color'] = 'blue' 設定會話
get(key, default=None)
例如:fav_color = request. session.get('fav_color', 'red')
pop(key)刪除該鍵值對並傳回值
#例如:fav_color = request.session.pop('fav_color')
keys()
items()
setdefault(key[,default=None]) 當key存在時傳回對應的值,不存在時將鍵值對加入字典並傳回預設的值
clear()
特殊方法
flush()
刪除目前的會話資料並刪除會話的Cookie。當使用者登出時可以使用此操作
set_expiry(value) 設定會話逾時時長
value可以設定為正整數,datatime/ timedelta,0,None
整數(秒) n秒不操作則過期
datatime/timedelta 此時間點過期
#0 關閉瀏覽器即過期
None 與全域預設值相同
get_expiry_age() 距離會話過期時長 當會話已過期或未自訂過期資訊時傳回None
#關鍵字參數
#odification :會話的最後一次修改時間,預設為目前 可以傳遞一個之前或之後的值,判斷還有多久過期
expory 自訂的過期訊息
##get_expiry_date() 傳回過期日期,已過期或未自訂回傳cookie的儲存時間
get_expire_at_browser_close()傳回True 或False,取決於使用者的會話Cookie在使用者瀏覽器關閉時會不會過期。 clear_expired() 類別方法 從會話的儲存中清除過期的會話。 cycle_key() 建立一個新的會話,同時保留目前的會話資料。 三: 使用快取'BACKEND': 'django.core.cache.backends.dummy.DummyCache', }}
300 即五分鐘
VERSION 預設的快取版本號#OPTIONS: 這個參數應該被傳到快取後端。有效的可選項清單根據快取的後端不同而不同,由第三方函式庫所支援的快取將會把這些選項直接配置到底層的快取庫。 快取的後端實作自己的選擇策略(檔案,資料庫,記憶體) 將會履行下面這些選項:MAX_ENTRIES:快取允許的最大條目數,超出這個數則舊值會被刪除. 這個參數預設是300.CULL_FREQUENCY:當達到MAX_ENTRIES 的時候,被刪除的條目比率。 實際比率是 1 / CULL_FREQUENCY, 所以設定CULL_FREQUENCY 為2會在達到MAX_ENTRIES 所設定值時刪去一半的快取。這個參數應該是整數,預設為 3.把 CULL_FREQUENCY的值設為 0 表示當達到MAX_ENTRIES時,快取將被清空。某些快取後端(database尤其)這將以很多快取丟失為代價.實例:#快取在記憶體中,且逾時時長為60*10 600秒,快取500條,每次刪除1/5CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache' , 'TIMEOUT': 600, 'OPTIONS': { 'MAX_ENTRIES': 500, : 5} }}
快取策略: 快取整站, 快取view, 快取範本片段
快取整站:
setting.py
1.08
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
# 'django. middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
##)1.10MIDDLEWARE = [#1.10
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCache#ware#. ]
注意順序不要錯
然後加入值在setting.py的最外層
CACHE_MIDDLEWARE_ALIAS – 用於儲存的快取的別名,不設定則為'default '
CACHE_MIDDLEWARE_SECONDS –每個page需要被快取多少秒.CACHE_MIDDLEWARE_KEY_PREFIX – 如果快取被使用相同Django安裝的多個網站所共享,那麼把這個值設成目前網站名,或其他能代表這個Django實例的唯一
字串,以避免key發生衝突。 如果你不在意的話可以設成空字串。
單一view快取
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
pass
多個URL 指向相同視圖,每個URL將會分別快取,如:
url(r'^foo/([0-9]{ 1,2})/$', my_view),
foo/12
foo/13 使用不同的快取,但是兩個12使用同一個
#@cache_page (60 * 15, cache=“special_cache")
如: 將會只用指定的快取
CACHES = {
'default': {
# 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'TIMEOUT': 600,##o
TION MAX_ENTRIES': 500, 'CULL_FREQUENCY': 5## }
## },BACKEND ': 'django.core.cache.backends.locmem.LocMemCache',
'TIMEOUT': 600,
'OPTIONS': {
, 'CULL_FREQUENCY': 5 } }##}
11666666666666如何6666如何指定如何指定如何指定如何提供快取# #當需要存取/cache/與/nocache/時,同樣指向一個頁面,但是一個緩存一個不緩存
#可以在url上指定哪個頁面緩存,而不是在view上
url(r'^cache/$', cache_page(60 * 15)(my_view), name='cache'),
url(r'^nocache/$',my_view, name='nocache' ),
模板快取
{% load cache %}
#{% cache 長度(秒) 名字%}
{% endcache 名字%}
更有彈性的使用快取
在views中導入django.core.cache 的caches
cad = caches['default'] # 這裡的名字與CACHES中的配置相同
cas = caches['special_cache']
常用的方法
cad.set('key','value',長度) 不設時長則取預設值或自訂值
cad.get('key') key 不存在回傳None,也可以指定預設值get('key','預設值'),沒有key則回傳'預設值'
cad.add('key','value') 當key不存在時增加key-value,當key已存在時不做動作,value或先前的值
set_many ({'key1':'v1','k2':'v2'})
get_many(['key1','key2'..]) 取得清單中的鍵的值 傳回值為標準字典
delete('key')
delete_many(['key1','key2']) 當key不存在時
clear() 刪除全部快取
close() 關閉快取
cad.incr('key',value) 相當於cad['key']+=value 當然,只是相當於,不能這麼做
#由於底層使用的是
new_value = value + delta
,那麼.當value是'a',也是可以的,只要是可以使用+的就可以
cad.decr('key',value) 減去,同上快取版本: VERSION 可以傳入同樣的鍵,卻保存不一樣的值,透過version來實現
#cad .set('key1','valu',version=3) 將key1設為version3,
ca.set('aa','dd',version=3)
#ca .set('aa','e',version=4)
print(ca.get('aa',version=3)) #=> dd
print(ca.get('aa',version=4)) #=> e
incr_version('key',value) 同樣的,value支援+-可以
decr_version('key',value)
但是不建議直接使用str等,更不建議使用自己的類別
但當確實需要使用自訂的類別來填入version時,需要重寫的方法有(python3.x)
str
add
sub
以上是詳解django傳遞臨時資料的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!