【一】Cookie與Session介紹
【1】早期的網站
- 早期的很多網站可能都沒有儲存使用者功能的需求,所有使用者訪問的返回結果都是一樣的,如新聞,部落格文章等等...
- 但是網際網路發展至今,已經有絕大多數網站,在你登入後反饋的頁面和不登入反饋的頁面已經是不一樣的了,這些網站就用到了儲存使用者登入資訊的技術
【2】Cookie
- 伺服器儲存在客戶端瀏覽器上的資訊都可以稱之為Cookie
- 指代服務端希望客戶端儲存起來的資料、
- 它的表現形式一般都是K:V鍵值對,可以有多個
【3】Session
- 儲存在伺服器上的資訊都可以稱之為Session
- 他指代服務端儲存的跟使用者資訊相關的資料
- 他的表現形式也是KV鍵值對,鍵和值都會會以加密的形式儲存到一張表裡
【4】總結
- cookie就是儲存在客戶端瀏覽器上的資訊
- session就是儲存在服務端上的資訊
- session是基於cookie工作的(其實大部分的儲存使用者狀態的操作都需要使用cookie)
【二】Django操作Cookie
- cookie是服務端希望瀏覽器儲存下來的內容,但是瀏覽器也有權利不儲存,
- 這樣瀏覽器就無法儲存使用者登入資訊
【1】檢視返回值變形
- 為了方便對Cookie的方便,需要將檢視函式的返回值進行小變形
obj = HttpResponse()
return obj
obj1 = render()
return obj1
obj2 = redirect()
return obj2
【2】設定cookie
set_cookie
obj = HttpResponse()
obj.set_cookie(key,value)
return obj
【3】獲取cookie值
COOKIES.get()
request.COOKIES.get(key)
【4】設定過期時間
obj = HttpResponse()
obj.set_cookie(key,value,max_age=5)
# 設定超時時間 5s 到期
return obj
【5】登出cookie
obj = HttpResponse()
obj.delete_cookie(key)
return obj
【6】登入功能小案例
# 登入認證裝飾器
# tag_url是獲取當前使用者想要進入的頁面
def login_auth(func):
def inner(request, *args, **kwargs):
if not request.COOKIES:
tag_url = request.get_full_path()
return redirect(to=f'/app1/login/?next={tag_url}')
res = func(request, *args, **kwargs)
return res
return inner
# 登入函式
# 這裡透過重定向到tag_url就可以進入到使用者想要的介面
def login(request):
from .lib.Form import LoginForm
form_obj = LoginForm()
if request.method == 'POST':
form_obj = LoginForm(request.POST)
if form_obj.is_valid():
tag_url = request.GET.get('next')
print(tag_url)
username = form_obj.cleaned_data.get('username')
obj = redirect(to=tag_url)
obj.set_cookie(key='username', value=username)
return obj
return render(request, 'login.html', locals())
# 裝上裝飾器的函式
@login_auth
def show_book(request):
from utils.page import Pagination
book_obj = models.Book.objects.all()
current_page = request.GET.get('page', 1)
all_count = book_obj.count()
page_obj = Pagination(current_page=current_page, all_count=all_count, per_page_num=3)
page_queryset = book_obj[page_obj.start:page_obj.end]
return render(request, 'book.html', locals())
【三】Django操作Session
- session資料是儲存在服務端的,給客戶端返回的是一個隨機的字串
- sessionid:隨機字串
【1】設定session
request.session['key'] = value
# 內部發生的事情
1.產生一個隨機的字串
2.在某個地方儲存字串與加密資料的對應關係
3.將產生的隨機字串也發給瀏覽器一份,並且讓它儲存
【2】獲取session
request.session.get('key')
# 內部發生的事情
1.獲取瀏覽器儲存的隨機字串
2.將獲取到的隨機字串與資料庫中的字串進行比對
3.如果有對應的資料,就將其以字典的形式封裝到request.session中,沒有就是None
【3】設定/獲取多個session值
- 當同一個IP地址且同一個瀏覽器給session設定多個值時,存在資料庫中的資料仍然只有一條
- 但是在取session的時候,可以透過
request.session
物件獲取到設定的多組鍵值對
【4】設定過期時間
# 設定過期時間
request.session.set_expiry(value)
# 如果value是個整數,session會在些秒數後失效。
# 如果value是個datatime或timedelta,session就會在這個時間後失效。
# 如果value是0,使用者關閉瀏覽器session就會失效。
# 如果value是None,session會依賴全域性session失效策略。
# 預設的過期時間為14天
【5】情況session
# 只刪除服務端的
request.session.delete()
# 客戶端 服務端都刪除的
request.session.flush()