1.早期的時(shí)候,網(wǎng)站都沒有保存用戶功能的需求,所有用戶訪問網(wǎng)站返回的結(jié)果都是一樣的,比如新聞、文章等網(wǎng)站!
創(chuàng)新互聯(lián)公司長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為開福企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,開福網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
2.但是,隨著網(wǎng)站的發(fā)展,出現(xiàn)了一些需要保存用戶信息的網(wǎng)站,比如:淘寶、京東、個(gè)人博客等!
3.以登錄功能為例,如果不保存用戶登錄的信息,就意味著用戶每次都需要重新登錄網(wǎng)站,為此非常的麻煩。
4.為了解決上述的麻煩,便產(chǎn)生了cookie和session
當(dāng)用戶第一次登錄之后,瀏覽器會(huì)將您登錄之后的用戶名和密碼保存到用戶瀏覽器,讓其保存在本地,之后再次訪問網(wǎng)站的時(shí)候,瀏覽器會(huì)幫您自動(dòng)的將保存的用戶名和密碼發(fā)送到瀏覽器,這樣就省去了登錄的操作!
裝逼小技巧:當(dāng)你點(diǎn)擊瀏覽器的設(shè)置,在里面查找cookie權(quán)限時(shí),選擇不允許站點(diǎn)保存cookie時(shí),以后該瀏覽器上需要用到記錄用戶狀態(tài)(登錄)的功能都無法實(shí)現(xiàn)了!
為了減少每次登錄網(wǎng)站都要登錄的麻煩,減少用戶每次操作都需要登錄的操作(每次添加到購物車一下就需要登錄將非常的麻煩)!
早期這樣將用戶的信息保存在瀏覽器是有非常大的隱患的!其他人很容易在瀏覽器內(nèi)看到你保存的用戶名和密碼,這樣用戶的信息就不安全了!
存儲(chǔ)/添加/修改:
def set_cookies(request):
resp = HttpResponse('set cookies is ok')
resp.set_cookie('uuname', 'zhangyang', max_age=500,expires=500)
return resp
每一個(gè)響應(yīng)對(duì)象對(duì)有一個(gè)set_cookies方法里面的參數(shù)分別是:key、value、max_age保存時(shí)間單位s,expires對(duì)于ie瀏覽器生效的保存時(shí)間
刪除:
httpresponse.delete_cookie(‘key’)--刪除指定key的cookie,如果key不存在,則什么也不發(fā)生
獲取cookies:
?value = request.COOKIES.get('key’,'默認(rèn)值‘)
from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
# 裝飾器 實(shí)現(xiàn)功能是只有登錄了之后才能訪問到該頁面,否則跳轉(zhuǎn)到登錄頁面
def login_out(func):
def wrapper(request,*args,**kwargs):
target_url = request.get_full_path()
# print(target_url)
if request.COOKIES.get('username'):
res=func(request,*args,**kwargs)
return res
else:
# 此處的設(shè)計(jì)是為了動(dòng)態(tài)的獲取用戶是從那個(gè)頁面進(jìn)行登錄的,如何執(zhí)行登錄之后在跳轉(zhuǎn)回該頁面
return HttpResponseRedirect('/login?next=%s'%target_url)
return wrapper
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username=='zhang' and password=='123':
# 獲取用戶是從哪個(gè)頁面登錄的url
url = request.GET.get('next')
if url:
# 獲取到了則登錄成功跳轉(zhuǎn)到該頁面
obj = HttpResponseRedirect(url)
else:
# 沒有獲取到則跳轉(zhuǎn)到默認(rèn)頁面
obj = HttpResponseRedirect('/login')
obj.set_cookie('username','zhang')
return obj
return render(request,'login.html')
@login_out
def home(request):
return HttpResponse('這是登錄之后的home頁面')
@login_out
def index(request):
return HttpResponse('這是登錄之后的導(dǎo)航頁')
為了解決cookie產(chǎn)生的危害,便產(chǎn)生了session,session是借助cookie進(jìn)行工作的!當(dāng)用戶將登錄的信息返回到服務(wù)器,服務(wù)器會(huì)將用戶的信息保存在服務(wù)器內(nèi)并返回一個(gè)隨機(jī)的字符串給瀏覽器,該字符串與這個(gè)用戶的信息相對(duì)應(yīng)!瀏覽器將這個(gè)隨機(jī)字符串以cookie的形式保存在瀏覽器本地,以后每次需要訪問網(wǎng)站的時(shí)候,瀏覽器就會(huì)把這個(gè)cookie的隨機(jī)字符串返回給服務(wù)器,服務(wù)器匹配與之對(duì)應(yīng)的用戶信息返回給前端!
為了解決cookie所存在的安全隱患,更好的保護(hù)用戶的隱私。
session對(duì)象是一個(gè)類似于字典的對(duì)象,可以用類似字典的方式進(jìn)行操作--session能夠存儲(chǔ)字符串、整形、字典、列表等
1.保存session的值到服務(wù)器
def set_session(request):
request.session['uname'] = 'wwc' ---存儲(chǔ)session的寫法
"""
內(nèi)部發(fā)送了那些事
1.django內(nèi)部會(huì)自動(dòng)幫你生成一個(gè)隨機(jī)字符串
2.django內(nèi)部自動(dòng)將隨機(jī)字符串和對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)到django_session表中
2.1先在內(nèi)存中產(chǎn)生操作數(shù)據(jù)的緩存
2.2在響應(yīng)結(jié)果django中間件的時(shí)候才真正的操作數(shù)據(jù)庫
3.將產(chǎn)生的隨機(jī)字符串返回給客戶端瀏覽器保存
"""
return HttpResponse('set session is ok')
存儲(chǔ)時(shí)會(huì)報(bào)錯(cuò)時(shí),可能是因?yàn)闆]有執(zhí)行數(shù)據(jù)庫遷移命令,因?yàn)閟ession是保存在服務(wù)端的,它需要django中有一張默認(rèn)的django_session表
2.獲取已經(jīng)存儲(chǔ)的session值
def get_session(request):
value = request.session.get['uname',默認(rèn)值]
"""
內(nèi)部發(fā)送了那些事
1.自動(dòng)從瀏覽器請(qǐng)求中獲取sessionid對(duì)應(yīng)的隨機(jī)字符串
2.拿著該隨機(jī)字符串去django_session表中查找對(duì)應(yīng)的數(shù)據(jù)
3.
如果比對(duì)上了 則將對(duì)應(yīng)的數(shù)據(jù)取出并以字典的形式封裝到request.session中
如果比對(duì)不上 則request.session.get()返回的是None
"""
return HttpResponse('session value is %s' % value)
3.刪除session
del request.session['key']
request.session.delete() # 只刪服務(wù)端的 客戶端的不刪
request.session.flush() # 瀏覽器和服務(wù)端都清空(推薦使用)
4.設(shè)置session的保存時(shí)長(默認(rèn)是2周)
法一:
request.session.set_expiry()
括號(hào)內(nèi)可以放四種類型的參數(shù)
1.整數(shù) 多少秒
2.日期對(duì)象 指定日期就失效
3.0 一旦當(dāng)前瀏覽器窗口關(guān)閉立刻失效
4.不寫 失效時(shí)間就取決于django內(nèi)部全局session默認(rèn)的失效時(shí)間
法二:
在setting.py中添加配置項(xiàng)SESSION_COOKIE_AGE=60*60*24*7*2
或者設(shè)置SESSION_EXPIRE_AT_BROWSER_CLOSE = True---表示只要瀏覽器關(guān)閉時(shí),session就失效(默認(rèn)為Flase)
5.其他需要了解的知識(shí)點(diǎn)
session是保存在服務(wù)端的 但是session的保存位置可以有多種選擇
1.MySQL
2.文件
3.redis
4.memcache
...
django_session表中的數(shù)據(jù)條數(shù)是取決于瀏覽器的
同一個(gè)計(jì)算機(jī)上(IP地址)同一個(gè)瀏覽器只會(huì)有一條數(shù)據(jù)生效
(當(dāng)session過期的時(shí)候可能會(huì)出現(xiàn)多條數(shù)據(jù)對(duì)應(yīng)一個(gè)瀏覽器,但是該現(xiàn)象不會(huì)持續(xù)很久,內(nèi)部會(huì)自動(dòng)識(shí)別過期的數(shù)據(jù)清除 你也可以通過python3 manage.py clearsessions清除)
主要是為了節(jié)省服務(wù)端數(shù)據(jù)庫資源
小練習(xí):如何利用session完成動(dòng)態(tài)跳轉(zhuǎn)登錄
當(dāng)我們使用session在服務(wù)端存儲(chǔ)用戶的信息,如果用戶過多,存儲(chǔ)信息量大,則很耗費(fèi)服務(wù)端資源!因此,產(chǎn)生了token來解決這一問題。
token就是一串加密的字符串,該字符串即保存著用戶信息又安全,在發(fā)送給服務(wù)端時(shí),我們可以對(duì)該字符串用我們的算法進(jìn)行比對(duì),如果正確則用戶信息正確,不一致則被篡改了!
小作業(yè):通過django中間件實(shí)現(xiàn)token功能!
思路圖: