
獲取cookie:

設(shè)置cookie:
這中設(shè)置cookie,關(guān)閉瀏覽器就失效了。

實(shí)例:
res = redirect('/index/')
res.set_cookie('username', 'liao', max_age=10) # 10秒之后失效
return res
或者:
import datetime
current_date = datetime.datetime.utcnow()
expires_date = current_date + datetime.timedelta(seconds=10) # 10秒之后過期
res.set_cookie('username', 'liao', expires=expires_date)
session:

Session依賴于Cookie,
服務(wù)端session:
request.session.get()
request.session[x] = x
request.session.clear()
配置文件中設(shè)置默認(rèn)操作:
SESSION_COOKIE_NAME = "seesionid"
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_AGE = 1209600 # session的cookie失效日期
SESSION_COOKIE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得session失效。
======
一、Cookie
如果禁用cookie,那么在所有的需要登錄網(wǎng)站,都不能使用了。
實(shí)質(zhì)是:客戶端瀏覽器上的一個(gè)文件。
類似于鍵值對的形式存在,像字典。
比如liao用戶登錄了服務(wù)器,服務(wù)器返回了一個(gè)鍵值對:
{ "is_login": "etrashdkjndas6ioiwdgvqjbwhkje"}
如果liao用戶保留了這個(gè)字符串,存在于本地。
cookie的保存與瀏覽器的特點(diǎn),我們可以使用這個(gè)特征來實(shí)現(xiàn)用戶登錄的功能。
示例:
設(shè)置cookie:
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
u = request.POST.get('username')
p = request.POST.get('pwd')
dic = user_info.get(u)
if not dic:
return render(request, 'login.html')
if dic['pwd'] == p:
res = redirect('/index/')
res.set_cookie('username', u)
return res
else:
return render(request, 'login.html')
注意我們的res.set_cookie(),就給瀏覽器設(shè)置了cookie。return之后就設(shè)置了。
示例:
取的cookie:
def index(request):
# 獲取當(dāng)前已經(jīng)登錄的用戶名
v = request.COOKIES.get('username')
print v
if not v:
return redirect('/cookie/login/')
return render(request, 'cookie/index.html', {'current_user':v})
上面兩個(gè)例子,實(shí)現(xiàn)了用戶驗(yàn)證。
登錄成功,set cookie,然后再判斷cookie是否存在。
1)獲取cookie:
request.COOKIES.get('username')
request.COOKIES['username']
2)設(shè)置cookie的時(shí)候需要注意:
返回的時(shí)候,需要設(shè)置cookie:
response = request.POST.get('username')
response.set_cookie('key', 'value')
return response
注意,這里是服務(wù)端的寫入。
3)注銷的時(shí)候,清除掉cookie:
我們設(shè)置過期時(shí)間為當(dāng)前時(shí)間,就清除了。
res.set_cookie('key', 'value', max_age=0)
如果按照上面的方式,關(guān)閉瀏覽器,再開啟瀏覽器cookie就會(huì)失效。
Cookie實(shí)現(xiàn)用戶登錄
cookie的用法:
1)設(shè)置cookie過期時(shí)間
方式一:
response = reidrect('/cookie/index/')
response.set_cookie('key', 'value', max_age=10) # 過期時(shí)間為10秒
return response
方式二:
import datetime
current_date = datetime.datetime.utcnow()
#res.set_cookie('username', u, max_age=4)
res.set_cookie('username', u, expires=current_date + datetime.timedelta(seconds=10)) # 10秒之后過期
return res
2)設(shè)置生效的路徑:path
比如分頁的時(shí)候,分頁的cookie生效路徑只能是那里。
3)設(shè)置生效的域名:domain
4)設(shè)置只能是httponly的情況:
稍微安全一點(diǎn)點(diǎn)。
res.set_cookie('user_type', 'asdqwe', httponly=True)

5)在客戶端讀寫cookie。
對比上面的服務(wù)端的讀寫cookie。
實(shí)例,通過js實(shí)現(xiàn)寫cookie。
jquery的插件jquery.cookie.js.
6)js中設(shè)置cookie的path。
那么此cookie只能在這個(gè)path中使用。
function change_page_size(ths){
var v = $(ths).val(); // 這個(gè)$(this)是擁有此方法的html元素
$.cookie('per_page_size', v, {'path':'/cookie/user_list/'}); // 設(shè)置cookie
location.reload(); // 重新刷新頁面
}
7)設(shè)置帶簽名的cookie
服務(wù)端設(shè)置帶簽名的cookie,加鹽。
res = HttpResponse('xxx')
res.set_signed_cookie('username', 'liao' , salt=‘a(chǎn)sdasa’)
# 取出加鹽后的cookie
request.get_signed_cookie('username', salt='asdasa')
Session
引子:基于Cookie做用戶驗(yàn)證的時(shí)候,敏感信息最好不要放在Cookie中。
Session原理:是保存在服務(wù)器端的鍵值對。

注意:要使用session,必須先做以下的步驟創(chuàng)建django_sesseion表:
python manage.py makemigrations
python manage.py migrate
示例:
# 服務(wù)端設(shè)置session
def login1(request):
if request.method == 'GET':
return render(request, 'cookie/login1.html')
elif request.method == 'POST':
username = request.POST.get('username')
pwd = request.POST.get('pwd')
print ('username:'+username, 'pwd:'+pwd)
if username == 'root' and pwd == '123':
# 生成隨機(jī)字符串
# 攜帶到用戶瀏覽器cookie
# 保存到session中
# 在隨機(jī)字符串的字典中設(shè)置相關(guān)內(nèi)容
request.session['username'] = username # 上面的四件事情,這一句就做了
request.session['is_login'] = True
return redirect('/cookie/index1/')
else:
return render(request, 'cookie/login1.html')
# 服務(wù)端取得session
def index1(request):
if request.session.get('is_login', None) == True:
return HttpResponse('index1')
else:
return HttpResponse('you did not login')
我們可以看到Cookie中有一個(gè)sessionid,說明session依賴于cookie:

操作session比操作cookie簡單多了,因?yàn)閐jango已經(jīng)幫我們做了很多事情。
session的操作:
request.session['key'] = value # 設(shè)置
request.session.get('key', None) # 取得session
request.session.setdefault('k1', 123) # 存在則不設(shè)置
del request.session['key'] # 刪除session
# 所有的鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items() # 鍵值對
request.session.iterkeys()
# 用戶session的隨機(jī)字符串
reques.session.session_key
# 將所有session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除
request.session.clear_expired()
# 檢查 用戶session的隨機(jī)字符串 在數(shù)據(jù)庫中是否存在
request.session.exists("session_key")
# 刪除session
1. request.session.delete("session_key") # 刪除此用戶所有session
2.del request.session['k1'] # 刪除session中的k1對應(yīng)的item
3.request.session.clear() # 效果和1相同,不過更加簡單。在注銷的時(shí)候使用。
# 設(shè)置失效時(shí)間
request.session.set_expiry(value)
如果value是個(gè)證書,session會(huì)在這些秒數(shù)之后失效。
如果value是個(gè)datatime或者timedelta,session就會(huì)在這個(gè)時(shí)間后失效
如果value是0,那么用戶關(guān)閉瀏覽器session就會(huì)失效
如果value是None,session會(huì)依賴全局session失效策略
eg:
request.session.set_expiry(60*60) # 設(shè)置保存一個(gè)小時(shí)
模板中使用session:
可以有2種方式,第一是views.py傳遞過來,第二是從request.session中取出
<body>
welcome {{ username }}! <br>
{{ request.session.username }}
</body>
session與cookie
在settings.py中的配置:

這些是默認(rèn)值,配置文件中沒有寫的話,就默認(rèn)是這些。
但是注意,一般會(huì)將:
SESSION_SAVE_EVERY_REQUEST = True
每次請求,都會(huì)向后推遲過期時(shí)間。
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 這個(gè)是默認(rèn)的配置,說明將session存于數(shù)據(jù)庫
如果你想要將session放到緩存中,只需要改為:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名,也可以是memcache
有三種緩存的方式:
1)數(shù)據(jù)庫db
2)緩存 memcache
3)文件級別 file
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = os.path.join(BASE_DIR, 'cache') # 在根目錄新建一個(gè)cache目錄
4)緩存+數(shù)據(jù)庫Session
django內(nèi)部不支持redis,只支持MemcachedCache.
經(jīng)驗(yàn)
1.注意:
session存在于服務(wù)器里面,前端是獲取不到的。