溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django框架設(shè)置cookies與獲取cookies的示例

發(fā)布時(shí)間:2021-05-22 11:04:13 來(lái)源:億速云 閱讀:149 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Django框架設(shè)置cookies與獲取cookies的示例,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

具體如下:

在Django里面,使用Cookie和Session看起來(lái)好像是一樣的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的東西的key, 很久以前,寫過(guò)一篇 django怎么處理session 的文章:django 自定義session 處理, 今天對(duì)cookies 進(jìn)行了同樣的操作:

from django.template import loader ,Context
from django.http import HttpResponse
def main(request):
   #不用模板
   response= HttpResponse('test')
   response.set_cookie('my_cookie','cookie value')
   return response
def main(request):
   #用模板
   response= render_to_response('xxxx.html', {})
   response.set_cookie('my_cookie','cookie value')
   return response

使用模板的情況和不使用模板的情況都做了測(cè)試, 可以向?yàn)g覽器設(shè)置cookies, 在客戶端可以用javascript 取出來(lái):

function getCookie(c_name)
{
if (document.cookie.length>0)
 {
 c_start=document.cookie.indexOf(c_name + "=")
 if (c_start!=-1)
  {
  c_start=c_start + c_name.length+1
  c_end=document.cookie.indexOf(";",c_start)
  if (c_end==-1) c_end=document.cookie.length
  return unescape(document.cookie.substring(c_start,c_end))
  }
 }
return ""
}

用上面的javascript 函數(shù)可以取出cookies, 如果需要在django 里面取出 cookies 呢,也很簡(jiǎn)單:

value = request.COOKIES["cookie_key"]

同樣的道理,也可以用 javascript 寫 cookies,

function setCookie(c_name,value,expiredays)
{
var exdate=new Date()
exdate.setDate(exdate.getDate()+expiredays)
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}

上面總結(jié)了用 django 讀寫cookies 與 用javascript 讀寫cookies. 根據(jù)不同的情況, 這兩種方法是經(jīng)常混合在一起使用的.

一.Django authentication

django authentication 提供了一個(gè)便利的user api接口,無(wú)論在py中 request.user,參見(jiàn)Request and response objects.還是模板中的{{user}}都能隨時(shí)隨地使用,如果從web開(kāi)發(fā)角度來(lái)看,其實(shí)無(wú)非就是cookie與session的運(yùn)用.

在項(xiàng)目首頁(yè),在登陸和注銷狀態(tài)下分別輸出所有session,如:

print request.session.items()
# 登陸狀態(tài)下輸出
[('domain', 'http://beginman.sinaapp.com'), ('_auth_user_backend', 'django.contrib.auth.backends.ModelBackend'), ('_auth_user_id', 1L)]
# 注銷狀態(tài)下輸出
[('domain', 'http://beginman.sinaapp.com')]

從輸出結(jié)果中可知曉,如果項(xiàng)目中settings.py配置如下:

#中間件
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware', #看這里
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware', #看這里
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.gzip.GZipMiddleware',  # 處理gzip壓縮,減輕服務(wù)器壓力
    'pagination.middleware.PaginationMiddleware', # django 第三方分頁(yè)
    'common.mymiddleware.Mymiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
#TEMPLATE_CONTEXT_PROCESSORS
# 注意django1.5的這個(gè)玩意兒與低版本的不同
# 參考:https://docs.djangoproject.com/en/1.3/ref/settings/#std:setting-TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
  "django.contrib.auth.context_processors.auth",
  "django.core.context_processors.debug",
  "django.core.context_processors.i18n",
  "django.core.context_processors.media",
  "django.core.context_processors.static",
  "django.core.context_processors.request",
  "django.contrib.messages.context_processors.messages"
)
  INSTALLED_APPS = (
  'django.contrib.auth',  #this
  'django.contrib.contenttypes', #this
  'django.contrib.sessions', #this
  'django.contrib.sites',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  # Uncomment the next line to enable the admin:
  'django.contrib.admin',
  # Uncomment the next line to enable admin documentation:
  # 'django.contrib.admindocs',
  'mysite',
)

那么就會(huì)有這樣的輸出,當(dāng)然這只是針對(duì)單用戶(這里拿我的博客開(kāi)刀).在登陸后同時(shí)在首頁(yè)輸出cookies:

print request.COOKIES
{'csrftoken': '9fBE9Kh0uuzXEMzWdc4z4aIOoZg1EaoI', 'sessionid': 'lf4dd7xjlyzrh5yvzbtltlbujy3ipp1f', 'Hm_lvt_c65358e73ce306691a49ae5119f58783': '1405408338'}

登陸成功后Django會(huì)自動(dòng)在客戶端生成一個(gè)sessionid,且這個(gè)sessionid在未注銷前一直不變,當(dāng)注銷后就改變了該sessionid了. Cookie中保存一個(gè)Session的索引編號(hào)(sessionid),其重要信息都保存在服務(wù)器端,Session控制.即可.

通過(guò)Cookie保存的sessionid與服務(wù)器端比較,當(dāng)?shù)扔跁r(shí)則表示用戶已登陸,若不等于或兩者有一方不存在或都不存在則用戶處于注銷狀態(tài).

二.Session 與Cookie

Django框架設(shè)置cookies與獲取cookies的示例

cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),所以session機(jī)制可能需要借助于cookie機(jī)制來(lái)達(dá)到保存標(biāo)識(shí)的目的.

補(bǔ)充:關(guān)于session和cookie的區(qū)別:

二者的定義:

當(dāng)你在瀏覽網(wǎng)站的時(shí)候,WEB 服務(wù)器會(huì)先送一小小資料放在你的計(jì)算機(jī)上,Cookie 會(huì)幫你在網(wǎng)站上所打的文字或是一些選擇,

都紀(jì)錄下來(lái)。當(dāng)下次你再光臨同一個(gè)網(wǎng)站,WEB 服務(wù)器會(huì)先看看有沒(méi)有它上次留下的 Cookie 資料,有的話,就會(huì)依據(jù) Cookie

里的內(nèi)容來(lái)判斷使用者,送出特定的網(wǎng)頁(yè)內(nèi)容給你。 Cookie 的使用很普遍,許多有提供個(gè)人化服務(wù)的網(wǎng)站,都是利用 Cookie

來(lái)辨認(rèn)使用者,以方便送出使用者量身定做的內(nèi)容,像是 Web 接口的免費(fèi) email 網(wǎng)站,都要用到 Cookie。

具體來(lái)說(shuō)cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。

同時(shí)我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),所以session機(jī)制可能需要借助于cookie機(jī)制

來(lái)達(dá)到保存標(biāo)識(shí)的目的,但實(shí)際上它還有其他選擇。

cookie機(jī)制。正統(tǒng)的cookie分發(fā)是通過(guò)擴(kuò)展HTTP協(xié)議來(lái)實(shí)現(xiàn)的,服務(wù)器通過(guò)在HTTP的響應(yīng)頭中加上一行特殊的指示以提示

瀏覽器按照指示生成相應(yīng)的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。而cookie的使用

是由瀏覽器按照一定的原則在后臺(tái)自動(dòng)發(fā)送給服務(wù)器的。瀏覽器檢查所有存儲(chǔ)的cookie,如果某個(gè)cookie所聲明的作用范圍

大于等于將要請(qǐng)求的資源所在的位置,則把該cookie附在請(qǐng)求資源的HTTP請(qǐng)求頭上發(fā)送給服務(wù)器。

cookie的內(nèi)容主要包括:名字,值,過(guò)期時(shí)間,路徑和域。路徑與域一起構(gòu)成cookie的作用范圍。若不設(shè)置過(guò)期時(shí)間,則表示這

個(gè)cookie的生命期為瀏覽器會(huì)話期間,關(guān)閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會(huì)話期的cookie被稱為會(huì)話cookie。

會(huì)話cookie一般不存儲(chǔ)在硬盤上而是保存在內(nèi)存里,當(dāng)然這種行為并不是規(guī)范規(guī)定的。若設(shè)置了過(guò)期時(shí)間,瀏覽器就會(huì)把cookie

保存到硬盤上,關(guān)閉后再次打開(kāi)瀏覽器,這些cookie仍然有效直到超過(guò)設(shè)定的過(guò)期時(shí)間。存儲(chǔ)在硬盤上的cookie可以在不同的瀏

覽器進(jìn)程間共享,比如兩個(gè)IE窗口。而對(duì)于保存在內(nèi)存里的cookie,不同的瀏覽器有不同的處理方式

session機(jī)制。session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息。

          當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session時(shí),服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí)

(稱為session id),如果已包含則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè)session檢索出來(lái)

使用(檢索不到,會(huì)新建一個(gè)),如果客戶端請(qǐng)求不包含session id,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相

關(guān)聯(lián)的session id,session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)session id將被在本次響應(yīng)

中返回給客戶端保存。保存這個(gè)session id的方式可以采用cookie,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給

服務(wù)器。一般這個(gè)cookie的名字都是類似于SEEESIONID。但cookie可以被人為的禁止,則必須有其他機(jī)制以便在cookie被禁止時(shí)

仍然能夠把session id傳遞回服務(wù)器。

經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把session id直接附加在URL路徑的后面。還有一種技術(shù)叫做表單隱藏字段。就是服務(wù)器

會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。比如:

<form name="testform" action="/xxx"> 
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> 
<input type="text"> 
</form>

實(shí)際上這種技術(shù)可以簡(jiǎn)單的用對(duì)action應(yīng)用URL重寫來(lái)代替。

cookie 和session 的區(qū)別:

1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。

2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙
   考慮到安全應(yīng)當(dāng)使用session。

3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能

考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。

4、單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。

5、所以個(gè)人建議:

將登陸信息等重要信息存放為SESSION
其他信息如果需要保留,可以放在COOKIE中

三.Django對(duì)于Cookie的處理方式

每個(gè)HttpRequest對(duì)象都對(duì)應(yīng)一個(gè)COOKIES對(duì)象,該對(duì)象是字典形式.

request.COOKIES['sessionid'] # 獲取
request.COOKIES.get('sessionid', None) # 獲取

對(duì)COOKIES的設(shè)置通過(guò)HttpResponse對(duì)象的set_cookie來(lái)完成,文檔傳送門

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)

參數(shù)如下:

(1).`max_age默認(rèn):None ,cookie需要延續(xù)的時(shí)間(以秒為單位) 如果參數(shù)是\ None`` ,這個(gè)cookie會(huì)延續(xù)到瀏覽器關(guān)閉為止。

(2).`expires默認(rèn)None ,cookie失效的實(shí)際日期/時(shí)間。 它的格式必須是:\ "Wdy, DD-Mth-YY HH:MM:SS GMT"。如果給出了這個(gè)參數(shù),它會(huì)覆蓋\max_age`` 參數(shù)。

(3).path 默認(rèn)是"/" ,cookie生效的路徑前綴。 瀏覽器只會(huì)把cookie回傳給帶有該路徑的頁(yè) 面,這樣你可以避免將cookie傳給站點(diǎn)中的其他的應(yīng)用,當(dāng)你不是控制你的站點(diǎn)的頂層時(shí),這樣做是特別有用的。

(4).domain 默認(rèn)None,這個(gè)cookie有效的站點(diǎn)。 你可以使用這個(gè)參數(shù)設(shè)置一個(gè)跨站點(diǎn)(cross-domain)的cookie。 比如,\ domain=".example.com" 可以設(shè)置一個(gè)在\ www.example.com 、\ www2.example.com 以及\ an.other.sub.domain.example.com 站點(diǎn)下都可讀到的cookie。
如果這個(gè)參數(shù)被設(shè)成\ None ,cookie將只能在設(shè)置它的站點(diǎn)下可以讀到。

(5).False 默認(rèn)False ,如果設(shè)置為 True ,瀏覽器將通過(guò)HTTPS來(lái)回傳cookie。

四.Django對(duì)Session的處理

如果想讓django項(xiàng)目支持session,則必須在settings.py中指定,見(jiàn)上.默認(rèn)情況django使用 django.contrib.sessions.models.Session將session存儲(chǔ)在你的數(shù)據(jù)庫(kù)中.,這里我們查看下,如一個(gè)多用戶的網(wǎng)站的django_session表:

mysql> select * from django_session;
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| session_key           | session_data                                                                                       | expire_date     |
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| 1x5fxr1upboyiw4ny640tgdl2mto6i6i | NjJkNzBiYjE2NjBlYTBkMGZmY2QzYmIxOGE5MDRmNTE1YTgzM2FmNzqAAn1xAS4=                                                             | 2014-07-16 02:21:35 |
..................

很長(zhǎng)一大段,這里省略了.如果在settings.py的 INSTALLED_APPS中添加了django.contrib.sessions則運(yùn)行manage.py syncdb將會(huì)生成數(shù)據(jù)庫(kù)級(jí)別的session,表名為django-session.

為了提升性能,我們可以使用緩存級(jí)別的session,這點(diǎn)會(huì)在后面提及.

1.在views中使用session

每個(gè)HttpRequest對(duì)象都有session屬性,那么我們可以在views中使用:

fav_color = request.session['fav_color']   #get
request.session['fav_color'] = 'blue'      #set
del request.session['fav_color']         #del
'fav_color' in request.session           #contains
fav_color = request.session.get('fav_color', 'red')
fav_color = request.session.pop('fav_color')  # pop

session對(duì)象字典形式,有keys(),items(),setdefault(),clear()等方法,以下方法是常用的:

(1).flush()

從session中刪除數(shù)據(jù),然后再生數(shù)據(jù),比如django的logout()函數(shù)就會(huì)調(diào)用它.

(2).set_test_cookie()

設(shè)置一個(gè)test cookie來(lái)判斷用戶瀏覽器是否接受cookie.

(3).test_cookie_worked()

當(dāng)設(shè)置了test cookie后返回True或Flase判斷用戶瀏覽器是否接受cookie.所以要先執(zhí)行set_test_cookie()來(lái)下個(gè)套.

(4).delete_test_cookie()

刪除test cookie,測(cè)試完成后要收回自己下的套.

(5).set_expiry(value)

設(shè)置過(guò)期時(shí)間,如果value是整數(shù)則表示N秒后過(guò)期,如果是時(shí)間或時(shí)間戳對(duì)象則表示指定到某一時(shí)間過(guò)期;如果value是0則在瀏覽器關(guān)閉后過(guò)期(會(huì)話session); 如果value 是None則使用全局session過(guò)期策略.

(6).get_expiry_age()

返回session過(guò)期時(shí)間

def login(request):
  if request.method == 'POST':
    if request.session.test_cookie_worked():  # 測(cè)套
      request.session.delete_test_cookie()   # 收套
      return HttpResponse("You're logged in.")
    else:
      return HttpResponse("Please enable cookies and try again.")
  request.session.set_test_cookie()       # 下套
  return render_to_response('foo/login_form.html')

2.在模板中使用session

如果在views設(shè)置了session,如request.session['ms'], 那么在模板中可以通過(guò){{ request.session.key }}的形式使用:

{{ request.session.ms }}

3.在views外使用session

從mysql檢索出來(lái)的django_session表來(lái)看,包含字段如下:

mysql> describe django_session;
+--------------+-------------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| session_key | varchar(40) | NO  | PRI | NULL  |    |
| session_data | longtext  | NO  |   | NULL  |    |
| expire_date | datetime  | NO  | MUL | NULL  |    |
+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

那么可以使用django 數(shù)據(jù)庫(kù)API來(lái)訪問(wèn)session,注意使用get_decoded() 來(lái)讀取實(shí)際的session數(shù)據(jù),如下:

>>> from django.contrib.sessions.models import Session
>>> s=Session.objects.all()
>>> s
[<Session: Session object>, <Session: Session object>, <Session: Session object>, <Session: Session object>, <Session: Session object>,....]
>>> for i in s:
...   print i.get_decoded()
...
{'domain': 'http://beginman.sinaapp.com'}
{'domain': 'http://beginman.sinaapp.com', '_auth_user_backend': 'django.contrib.auth.backends.ModelBackend', '_auth_user_id': 1L}
{'domain': 'http://beginman.sinaapp.com'}
....

4.其他細(xì)節(jié)

ession 字典接受任何支持序列化的Python對(duì)象。 參考Python內(nèi)建模塊pickle的文檔以獲取更多信息。

Session 數(shù)據(jù)存在數(shù)據(jù)庫(kù)表 django_session 中

Session 數(shù)據(jù)在需要的時(shí)候才會(huì)讀取。 如果你從不使用 request.session , Django不會(huì)動(dòng)相關(guān)數(shù)據(jù)庫(kù)表的一根毛。11

Django 只在需要的時(shí)候才送出cookie。 如果你壓根兒就沒(méi)有設(shè)置任何會(huì)話數(shù)據(jù),它不會(huì) 送出會(huì)話cookie(除非 SESSION_SAVE_EVERY_REQUEST 設(shè)置為 True )。

Django session 框架完全而且只能基于cookie。 它不會(huì)后退到把會(huì)話ID編碼在URL中(像某些工具(PHP,JSP)那樣)。

這是一個(gè)有意而為之的設(shè)計(jì)。 把session放在URL中不只是難看,更重要的是這讓你的站點(diǎn) 很容易受到攻擊——通過(guò) Referer header進(jìn)行session ID”竊聽(tīng)”而實(shí)施的攻擊。

五.Session之存取Redis Django實(shí)現(xiàn)

session可以在數(shù)據(jù)庫(kù)級(jí)別,緩存級(jí)別,文件級(jí)別,cookie級(jí)別基礎(chǔ)上存取,對(duì)于緩存級(jí)別而言無(wú)疑是最提升性能的,我們可以放在django緩存系統(tǒng)中,也可以在memcache中,也可以在Redis中. 這里比較推薦Redis.我們完全可以用Redis實(shí)現(xiàn)Session功能.

1.我們知道session其實(shí)是在cookie中保存了一個(gè)sessionid,用戶每次訪問(wèn)都將sessionid發(fā)給服務(wù)器,服務(wù)器通過(guò)ID查找用戶對(duì)應(yīng)的狀態(tài)數(shù)據(jù)。在這里我的處理方式也是在cookie中定義一個(gè)sessionid,程序需要取得用戶狀態(tài)時(shí)將sessionid做為key在Redis中查找。

2.同時(shí)session支持用戶在一定時(shí)間不訪問(wèn)將session回收。

思路參考:https://www.jb51.net/article/99370.htm

第三方庫(kù):django-redis-sessions,github地址,提供了Redis database backend for your sessions. 另一個(gè)第三方庫(kù)Redis Django Cache Backend ,A cache backend for Django using the Redis datastructure server.用Redis存儲(chǔ)緩存數(shù)據(jù).

對(duì)此我們可以應(yīng)用到自己的項(xiàng)目中,如之前一篇Redis key的設(shè)計(jì)模式 & django登陸 提到的實(shí)例,那么接下來(lái)我們?cè)诖嘶A(chǔ)上實(shí)現(xiàn)session,cookie,Redis定制的用戶系統(tǒng).

注意要實(shí)現(xiàn)配置好Redis服務(wù).

1.安裝&配置

(1).首先安裝配置django-redis-sessions:

pip install django-redis-sessions

在settings.py中設(shè)置SESSION_ENGINE,它默認(rèn)是: django.contrib.sessions.backends.db 這里設(shè)置如下:

SESSION_ENGINE = 'redis_sessions.session'

然后在settings.py中設(shè)置Redis數(shù)據(jù)庫(kù)信息:

SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = 'password'
SESSION_REDIS_PREFIX = 'session'
# If you prefer domain socket connection, you can just add this line instead of SESSION_REDIS_HOST and SESSION_REDIS_PORT.
SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = '/var/run/redis/redis.sock'

配置完成后可測(cè)試如下:

$ pip install django nose redis
# Make sure you have redis running on localhost:6379
(poem)[beginman@beginman poem]$ nosetests
----------------------------------------------------------------------
Ran 0 tests in 0.001s
OK

(2).安裝配置django-redis-cache

pip install django-redis-cache

然后在settings.py配置CACHES

#On Django < 1.3:
CACHE_BACKEND = 'redis_cache.cache://:'
#On Django >= 1.3:
# When using TCP connections
CACHES = {
  'default': {
    'BACKEND': 'redis_cache.RedisCache',
    'LOCATION': '<host>:<port>',
    'OPTIONS': {
      'DB': 1,
      'PASSWORD': 'yadayada',
      'PARSER_CLASS': 'redis.connection.HiredisParser',
      'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool',
      'CONNECTION_POOL_CLASS_KWARGS': {
        'max_connections': 50,
        'timeout': 20,
      }
    },
  },
}
# When using unix domain sockets
# Note: ``LOCATION`` needs to be the same as the ``unixsocket`` setting
# in your redis.conf
CACHES = {
  'default': {
    'BACKEND': 'redis_cache.RedisCache',
    'LOCATION': '/path/to/socket/file',
    'OPTIONS': {
      'DB': 1,
      'PASSWORD': 'yadayada',
      'PARSER_CLASS': 'redis.connection.HiredisParser'
    },
  },
}
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',  # This must be first on the list
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
(...)
'django.middleware.cache.FetchFromCacheMiddleware', # This must be last

注意關(guān)于TCP連接:

#這里是TCP連接
CACHES = {
  'default': {
    'BACKEND': 'redis_cache.RedisCache',
    'LOCATION': '127.0.0.1:6379',
    'OPTIONS': {
      'DB': 0,
      'PASSWORD': '', # 這里沒(méi)有設(shè)置密碼
      # 'PARSER_CLASS': 'redis.connection.HiredisParser', # 這段可先注釋掉否則出現(xiàn) :Hiredis is not installed的錯(cuò)誤
      'CONNECTION_POOL_CLASS': 'redis.BlockingConnectionPool',
      'CONNECTION_POOL_CLASS_KWARGS': {
        'max_connections': 50,
        'timeout': 20,
      }
    },
  },
}

至此我們的Redis For Django算是完成了,如果不太明白,還有一篇文章Using Redis as Django's session store and cache backend可以借鑒.

接下來(lái)我們可以在django中使用cache,存儲(chǔ)在Redis中.如下:

# Start by importing your default cache:
from django.core.cache import cache
# Store data under a-unique-key:
cache.set('a-unique-key', 'this is a string which will be cached')
# Later on you can retrieve it in another function:
cache.get('a-unique-key') # Will return None if key is not found in cache
# You can specify a default value:
cache.get('another-unique-key', 'default value')
# You can store multiple values at once:
cache.set_many({'a': 1, 'b': 2, 'c': 3})
# And fetch multiple values:
cache.get_many(['a', 'b', 'c']) # returns {'a': 1, 'b': 2, 'c': 3}
# You can store complex types in the cache:
cache.set('a-unique-key', {
  'string'  : 'this is a string',
  'int'    : 42,
  'list'   : [1, 2, 3, 4],
  'tuple'   : (1, 2, 3, 4),
  'dict'   : {'A': 1, 'B' : 2},
})

如果我們選擇socket連接方式而非TCP,那么在運(yùn)行中可能會(huì)出現(xiàn)如下錯(cuò)誤:Error 2 connecting to unix socket: /var/run/redis/redis.sock. No such file or directory.

這是因?yàn)閞edis 默認(rèn)沒(méi)有開(kāi)啟unix socket,需要在/etc/redis/redis.conf中修改,如下:

unixsocket /var/run/redis/redis.sock
unixsocketperm 777

記住配置完成之后要重啟Redis服務(wù):

$ sudo service redis-server restart

關(guān)于“Django框架設(shè)置cookies與獲取cookies的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI