發展史 1.早期的時候,網站都沒有保存用戶功能的需求,所有用戶訪問網站返回的結果都是一樣的,比如新聞、文章等網站! 2.但是,隨著網站的發展,出現了一些需要保存用戶信息的網站,比如:淘寶、京東、個人博客等! 3.以登錄功能為例,如果不保存用戶登錄的信息,就意味著用戶每次都需要重新登錄網站,為此非常的 ...
發展史
1.早期的時候,網站都沒有保存用戶功能的需求,所有用戶訪問網站返回的結果都是一樣的,比如新聞、文章等網站!
2.但是,隨著網站的發展,出現了一些需要保存用戶信息的網站,比如:淘寶、京東、個人博客等!
3.以登錄功能為例,如果不保存用戶登錄的信息,就意味著用戶每次都需要重新登錄網站,為此非常的麻煩。
4.為瞭解決上述的麻煩,便產生了cookie和session
1.cookie
1.1 什麼是cookie
當用戶第一次登錄之後,瀏覽器會將您登錄之後的用戶名和密碼保存到用戶瀏覽器,讓其保存在本地,之後再次訪問網站的時候,瀏覽器會幫您自動的將保存的用戶名和密碼發送到瀏覽器,這樣就省去了登錄的操作!
裝逼小技巧:當你點擊瀏覽器的設置,在裡面查找cookie許可權時,選擇不允許站點保存cookie時,以後該瀏覽器上需要用到記錄用戶狀態(登錄)的功能都無法實現了!
1.2 為什麼要用cookie
為了減少每次登錄網站都要登錄的麻煩,減少用戶每次操作都需要登錄的操作(每次添加到購物車一下就需要登錄將非常的麻煩)!
1.3 cookie的危害
早期這樣將用戶的信息保存在瀏覽器是有非常大的隱患的!其他人很容易在瀏覽器內看到你保存的用戶名和密碼,這樣用戶的信息就不安全了!
1.4 如何使用cookie
存儲/添加/修改:
def set_cookies(request):
resp = HttpResponse('set cookies is ok')
resp.set_cookie('uuname', 'zhangyang', max_age=500,expires=500)
return resp
每一個響應對象對有一個set_cookies方法裡面的參數分別是:key、value、max_age保存時間單位s,expires對於ie瀏覽器生效的保存時間
刪除:
httpresponse.delete_cookie(‘key’)--刪除指定key的cookie,如果key不存在,則什麼也不發生
獲取cookies:
value = request.COOKIES.get('key’,'預設值‘)
利用cookie製作動態跳轉登錄
from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
# 裝飾器 實現功能是只有登錄了之後才能訪問到該頁面,否則跳轉到登錄頁面
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:
# 此處的設計是為了動態的獲取用戶是從那個頁面進行登錄的,如何執行登錄之後在跳轉回該頁面
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':
# 獲取用戶是從哪個頁面登錄的url
url = request.GET.get('next')
if url:
# 獲取到了則登錄成功跳轉到該頁面
obj = HttpResponseRedirect(url)
else:
# 沒有獲取到則跳轉到預設頁面
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('這是登錄之後的導航頁')
2. session
2.1 什麼是session
為瞭解決cookie產生的危害,便產生了session,session是藉助cookie進行工作的!當用戶將登錄的信息返回到伺服器,伺服器會將用戶的信息保存在伺服器內並返回一個隨機的字元串給瀏覽器,該字元串與這個用戶的信息相對應!瀏覽器將這個隨機字元串以cookie的形式保存在瀏覽器本地,以後每次需要訪問網站的時候,瀏覽器就會把這個cookie的隨機字元串返回給伺服器,伺服器匹配與之對應的用戶信息返回給前端!
2.2 為什麼要有session
為瞭解決cookie所存在的安全隱患,更好的保護用戶的隱私。
2.3 如何使用session
session對象是一個類似於字典的對象,可以用類似字典的方式進行操作--session能夠存儲字元串、整形、字典、列表等
1.保存session的值到伺服器
def set_session(request):
request.session['uname'] = 'wwc' ---存儲session的寫法
"""
內部發送了那些事
1.django內部會自動幫你生成一個隨機字元串
2.django內部自動將隨機字元串和對應的數據存儲到django_session表中
2.1先在記憶體中產生操作數據的緩存
2.2在響應結果django中間件的時候才真正的操作資料庫
3.將產生的隨機字元串返回給客戶端瀏覽器保存
"""
return HttpResponse('set session is ok')
存儲時會報錯時,可能是因為沒有執行資料庫遷移命令,因為session是保存在服務端的,它需要django中有一張預設的django_session表
2.獲取已經存儲的session值
def get_session(request):
value = request.session.get['uname',預設值]
"""
內部發送了那些事
1.自動從瀏覽器請求中獲取sessionid對應的隨機字元串
2.拿著該隨機字元串去django_session表中查找對應的數據
3.
如果比對上了 則將對應的數據取出並以字典的形式封裝到request.session中
如果比對不上 則request.session.get()返回的是None
"""
return HttpResponse('session value is %s' % value)
3.刪除session
del request.session['key']
request.session.delete() # 只刪服務端的 客戶端的不刪
request.session.flush() # 瀏覽器和服務端都清空(推薦使用)
4.設置session的保存時長(預設是2周)
法一:
request.session.set_expiry()
括弧內可以放四種類型的參數
1.整數 多少秒
2.日期對象 指定日期就失效
3.0 一旦當前瀏覽器視窗關閉立刻失效
4.不寫 失效時間就取決於django內部全局session預設的失效時間
法二:
在setting.py中添加配置項SESSION_COOKIE_AGE=60*60*24*7*2
或者設置SESSION_EXPIRE_AT_BROWSER_CLOSE = True---表示只要瀏覽器關閉時,session就失效(預設為Flase)
5.其他需要瞭解的知識點
session是保存在服務端的 但是session的保存位置可以有多種選擇
1.MySQL
2.文件
3.redis
4.memcache
...
django_session表中的數據條數是取決於瀏覽器的
同一個電腦上(IP地址)同一個瀏覽器只會有一條數據生效
(當session過期的時候可能會出現多條數據對應一個瀏覽器,但是該現象不會持續很久,內部會自動識別過期的數據清除 你也可以通過python3 manage.py clearsessions清除)
主要是為了節省服務端資料庫資源
小練習:如何利用session完成動態跳轉登錄