首頁 >後端開發 >Python教學 >詳解django傳遞臨時資料的方法

詳解django傳遞臨時資料的方法

高洛峰
高洛峰原創
2017-03-23 14:52:271954瀏覽

把最近用到的臨時資料傳遞總結下

有三種方法,cookie,session,cache

先說下對我來說會怎麼選,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

     刪除操作
delete

_cookie(key, path='/', domain=None)刪除key指定的cookie,當該cookie不存在時什麼也不會發生

當set_cookie指定了path與domain時刪除時應保持一致,否則不會刪除

    其他內容
  •   因為是一個標準的字典,所以request.COOKIES['key']='value'也可以把內容放到cookie裡,但是在傳遞給下個view的時候值就遺失了

   在一個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中
  • 在設定完成之後,執行manage.py migrate 

#基於檔案設定SESSION_ENGINE為」django.contrib.sessions.backends.file"。
  • 同時可以設定SESSION_FILE_PATH,來指定檔案存放位置,否則使用系統預設的值,不修改就是/tmp

基於cookie的會話,不推薦,因為客戶可以設定不使用cookie
  • 設定SESSION_ENGINE 為"django.contrib.sessions.backends.signed_cookies"

  • 基於快取,當設定了快取並設定快取存放位置為記憶體時可以將會話設定為基於快取的,只有快取使用Memcached作為後端時才推薦這樣

否則的話不如直接使用快取,靈活度更高,負載更小

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()   建立一個新的會話,同時保留目前的會話資料。

三: 使用快取

  • 設定快取(使用內建的後台當記憶體足夠且有必要時可以配置Memcached)

快取在檔案中

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',

        'LOCATION': '/var/tmp/django_cache',   # 檔案路徑,當在win下方改為'c:/tmp/django_cache'

    }

}

路徑是絕對路徑,是一個目錄,需要有目前使用者的42(讀寫)權限

快取在資料庫中

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',

        'LOCATION': 'my_cache_table',         'LOCATION': 'my_cache_table',         'LOCATION': 'my_cache_table',         'LOCATION': 'my_cache_table',  且未使用過即可

    }

}

python manage.py createcachetable  建立快取表,表名由LOCATION指定

快取在記憶體中(預設)

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

        'LOCATION': 'unique-snowflake',  # 記憶體只有當有多個的時需要設定,只有一個記憶體就不用設定了

#    }

}

#虛擬快取:不快取,但是保留

介面用於確保開發生產環境的一致性

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',

    }

}

  • #」設定參數參數參數

TIMEOUT  逾時時間預設

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/5

CACHES = {

    '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.10

MIDDLEWARE = [

#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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn