無錫網(wǎng)站優(yōu)化價格福鼎網(wǎng)站優(yōu)化公司
Cookie簡介
Cookie,有時也用Cookies,是指web程序為了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密),一般是以鍵值對的形式存在,Cookie具有不可跨域名性
Cookie是http協(xié)議中定義在 header 中的字段
Cookie解決無狀態(tài)問題原理
客戶端訪問服務端,服務端生成一個有限時間的cookie給客戶端,cookie保存在客戶端本地瀏覽器,下次進行訪問的時候,客戶端就會攜帶cookie訪問服務端,服務端可以通過cookie辨別客戶端用戶
Cookie的使用
from django.shortcuts import render
from django.http import HttpResponse# Create your views here.# 體驗了一下報錯:The view createCookie_app.views.cookie_index didn't return an HttpResponse object. It returned None instead.
def cookie_index(request):return HttpResponse("設置cookie").set_cookie('name', 'root')# 先用這種
def cookie_index1(request):resp = HttpResponse("設置cookie")resp.set_cookie('name', 'root')return respdef cookie_get(request):print(request.COOKIES)return HttpResponse('獲取cookie:%s' % request.COOKIES['name'])
Cookie的免登錄設置
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect# Create your views here.
from django.urls import reversedef login(request):return render(request, 'login/login.html')def do_login(request):resp = HttpResponse()# 獲取請求體數(shù)據(jù)data = request.POSTusername = data['uname']password = data['pwd']try:rember = data['rember']except:rember = '0'print('username:', username)print('password:', password)if username == 'django' and password == '123':resp.content = '登錄成功'if rember == 'rember':print('設置cookie')# 設置cookieresp.set_cookie('uname', username, max_age=60*60*24*3)resp.set_cookie('pwd', password, max_age=60*60*24*3)else:# 刪除cookieresp.delete_cookie('uname')resp.delete_cookie('pwd')return respelse:return HttpResponseRedirect(reverse('login'), {'msg': '用戶名或密碼錯誤'})
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h1>登錄頁面</h1>{% csrf_token %}<form action="/do_login/" method="post">{% csrf_token %}用戶名:<input type="text" name="uname" ><br>密碼:<input type="password" name="pwd" ><br>記住我<input type="checkbox" name="rember" value="rember"><br><input type="submit" value="登錄"><br></form>
</body>
</html>
from django.urls import path
from .views import *urlpatterns = [path('login/', login, name='login'),path('do_login/', do_login, name='logout')
]
Session介紹
Session 對象存儲特定用戶會話所需的屬性及配置信息。當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而且在整個用戶會話中一直存在下去。(session是依賴于cookie的)
Django框架中的session管理允許存儲和檢索任意數(shù)據(jù),它在服務器端存儲數(shù)據(jù)并抽象cookie的發(fā)送和接收。
啟用session
要應用session,必須開啟session中間層,在settings.py中:
MIDDLEWARE = [# 啟用 Session 中間層'django.contrib.sessions.middleware.SessionMiddleware',
]
五種session的引擎
Django中默認支持Session,其內部提供了5種類型供開發(fā)者使用:
- 數(shù)據(jù)庫
- 緩存
- 緩存+數(shù)據(jù)庫
- 文件
- Cookie
五種方式的啟動配置各異,但是啟動完成后,在程序中的使用方式都相同:
數(shù)據(jù)庫方式
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# 數(shù)據(jù)庫類型的session引擎需要開啟此應用,啟用 sessions 應用
INSTALLED_APPS = ['django.contrib.sessions',
]
緩存
速度最快,但是由于數(shù)據(jù)是保存在內存中,所以不是持久性的,服務器重啟或者內存滿了就會丟失數(shù)據(jù)
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
緩存+數(shù)據(jù)庫
速度次于單純緩存方式,但是實現(xiàn)了持久性,每次寫入高速緩存也將寫入數(shù)據(jù)庫,并且如果數(shù)據(jù)尚未存在于緩存中,則使用數(shù)據(jù)庫
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
一般用以上三種,另外兩種少用,cookie不推薦使用
文件
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 設置文件位置, 默認是 tempfile.gettempdir(),
# linux下是:/tmp
# windows下是: C:\Users\51508\AppData\Local\Temp
SESSION_FILE_PATH = 'd:\session_dir'
加密cookie
基于cookie的session,所有數(shù)據(jù)都保存在cookie中,一般情況下不建議使用這種方式
- cookie有長度限制,4096個字節(jié)
- cookie不會因為服務端的注銷而無效,那么可能造成攻擊者使用已經(jīng)登出的cookie模仿用戶繼續(xù)訪問網(wǎng)站
- SECRET_KEY這個配置項絕對不能泄露,否則會讓攻擊者可以遠程執(zhí)行任意代碼
- cookie過大,會影響用戶訪問速度
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
?Session的設置
django默認就會配置數(shù)據(jù)庫存儲session的設置,所以使用默認設置的時候需要配置好數(shù)據(jù)庫信息
進行數(shù)據(jù)庫的同步。數(shù)據(jù)庫同步后會發(fā)現(xiàn)數(shù)據(jù)庫中有一個django-session的表
之后進行設置的session將會存儲在這張表內
創(chuàng)建與獲取session
session = request.session# 配置session的時間
session.set_expiry(秒)# 設置session
session['uname'] = 'xxx'# 獲取sessionuname = session.get('uname')
刪除session
# 刪除某個key
del request.session['has_commented']
# 從會話中刪除當前會話數(shù)據(jù)并刪除會話cookie
flush()
# 設置會話的到期時間
# 如果value是整數(shù),則session將在多少秒不活動后到期
# 如果value是一個datetime或timedelta,該session將在相應的日期/時間到期
# 如果value是0,用戶的會話cookie將在用戶的Web瀏覽器關閉時到期
# 如果value是None,則會話將恢復為使用全局會話到期策略
set_expiry(value)
其他session方法# 設置測試cookie以確定用戶的瀏覽器是否支持cookie
set_test_cookie()
# 返回True或者False,取決于用戶的瀏覽器是否接受測試cookie
test_cookie_worked()
# 刪除測試cookie
delete_test_cookie()
# 返回此會話到期之前的秒數(shù)
# kwargs 為 `modification` 和 `expiry`,一般不指定
# modification:最后一次訪問日期,默認當前時間, now
# expiry: 到期剩余秒數(shù),默認全局配置時間
get_expiry_age(**kwargs)
# 返回此會話將過期的日期
# 參數(shù)同 get_expiry_age
get_expiry_date(**kwargs)
# 返回True或者False,取決于用戶的Web瀏覽器關閉時用戶的會話cookie是否會過期
get_expire_at_browser_close()
# 從會話存儲中刪除過期的會話,這是個類方法。
clear_expired()
# 在保留當前會話數(shù)據(jù)的同時創(chuàng)建新的會話密鑰
cycle_key()
?session的settings.py使用
# Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
SESSION_COOKIE_NAME = "sessionid"?
# Session的cookie保存的路徑(默認)
SESSION_COOKIE_PATH = "/"?
# Session的cookie保存的域名(默認)
SESSION_COOKIE_DOMAIN = None
# 是否Https傳輸cookie(默認)
SESSION_COOKIE_SECURE = False
# 是否Session的cookie只支持http傳輸(默認)
SESSION_COOKIE_HTTPONLY = True
# Session的cookie失效日期(2周)(默認)
SESSION_COOKIE_AGE = 1209600
# 是否關閉瀏覽器使得Session過期(默認)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# 是否每次請求都保存Session,默認修改之后才保存(默認)
SESSION_SAVE_EVERY_REQUEST = False ?
session登錄
使用了admin的后臺管理系統(tǒng)
-
用django后臺管理的用戶登錄驗證
-
實現(xiàn)登錄功能
-
django.contrib.auth
- authenticate():?https://docs.djangoproject.com/zh-hans/4.1/topics/auth/default/#authenticating-users
- login():?使用 Django 的驗證系統(tǒng) | Django 文檔 | Django
-
-
實現(xiàn)退出用戶功能
- logout():?使用 Django 的驗證系統(tǒng) | Django 文檔 | Django
-
沒登錄自動跳登錄頁面
django.contrib.auth.decorators.login_required
實現(xiàn)- login_required() :使用 Django 的驗證系統(tǒng) | Django 文檔 | Django
views.py
重定向還有模板jinja2語法好重要喲
from django.contrib import auth
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from django.views import View
from django.urls import reverse
from django.http import HttpResponseRedirect
# Create your views here.class m_login(View):def get(self, request):error_message = request.session.get('login_err')request.session['login_err'] = Nonereturn render(request, 'login.html', {'login_err':error_message})def post(self, request):username = request.POST.get('uname')password = request.POST.get('pwd')print(username)print(password)user = auth.authenticate(username=username, password=password)if user:login(request, user) # login() 會在 session 中保存用戶的ID。return render(request, 'index.html', {'name': username})# return render(request, 'index.html', {'name': username})else:request.session['login_err'] = '用戶名或密碼錯誤!'return redirect('session:login')def index(request):# 判斷用戶是否登錄# 沒有登錄return HttpResponseRedirect(reverse('session:login'))
session登出
# 判斷用戶是否登錄,# 沒有登錄,則跳轉到登錄頁面
@login_required(login_url='session:login')
def index(request):# 有登錄正常返回首頁return HttpResponseRedirect(reverse('session:index'))# 退出登錄
def logout(request):auth.logout(request) # 清除session中的用戶信息return HttpResponseRedirect(reverse('session:login'))