cookie 與session
目的:是為了保存客戶端的狀態
原因:因為HTTP協議是無狀態的
由於http協議是無狀態的 所以我們需要發明一些能夠保存用戶的技術
cookie:
cookie是保存在客戶端瀏覽器上的鍵值對,是由服務端生成,然后發送給客戶端瀏覽器保存的。因此,瀏覽器有權限禁止寫入cookie,這個功能可以在瀏覽器中設置。
django如何操作cookie:
obj = HttpResponse() # 利用obj對象才能操作cookie
return obj
obj = render()
return obj
boj = redirect()
return obj
設置cookie:obj.set_cookie('k1','v1')
obj.set_cookie('k1','v1') # 告訴瀏覽器設置
獲取cookie:request.COOKIES.get('k1')
request.COOKIES.get('k1') # 獲取瀏覽器攜帶過來的cookie值
設置超時時間:obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',max_age=3) # 針對谷歌瀏覽器,用max_age
obj.set_cookie('k1','v1',expires=3) # 針對IE瀏覽器,用expires
刪除cookie(注銷,退出登錄),一般不會刪除。
基於cookie實現用戶登錄校驗
裝飾器
用戶在沒有登錄之前如果訪問了一個需要登錄之后才能訪問的頁面
那么會先跳轉到登錄頁面 用戶輸入用戶名和密碼並正確的情況下
再自動跳轉到之前用戶想要訪問的頁面
1.request.path_info
2.利用get請求攜帶參數的方法
session:
session是保存在服務端上面的鍵值對
session的工作機制是需要依賴於cookie的
設置session:request.session['k1'] = 'v1'
request.session['k1'] = 'v1'
# 第一次設置的時候會報錯,是因為你沒有執行數據庫遷移命令 生成django需要用到的一些默認表(django_session)
# django默認的session失效時間是14天 2周
request.session['k1'] = 'v1'
"""
執行上面這一句代碼會發生了哪些事兒
1.djang內部自動幫你調用算法生成一個隨機的字符串
2.在django_session表中添加數據(數據也是加密處理)
隨機字符串 加密之后的數據 失效時間
ashdjsad jsadsada
3.將產生的隨機字符串返回給客戶端瀏覽器 讓瀏覽器保存
sessionid:隨機字符串
"""
獲取session:request.session.get('k1')
request.session.get('k1')
"""
1.django內部會自動去請求頭里面獲取cookie
2.拿着sessionid所對應的隨機字符串去django_sessoion表中一一比對
3.如果比對上了 會將隨機字符串對應的數據獲取出來 自動放入request.session中供程序員調用
如果沒有就是一個空字典
"""
刪除session:request.session.delete()
request.session.delete()
# 客戶端和服務端全部刪除 只會根據瀏覽器的不同刪對應的數據
設置失效時間:request.session.set_expiry(value)
# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數后失效。
* 如果value是個datatime或timedelta,session就會在這個時間后失效。
* 如果value是0,用戶關閉瀏覽器session就會失效。
* 如果value是None,session會依賴全局session失效策略。
session版的登錄校驗:
from functools import wraps
def check_login(func):
@wraps(func)
def inner(request, *args, **kwargs):
next_url = request.get_full_path()
if request.session.get("user"):
return func(request, *args, **kwargs)
else:
return redirect("/login/?next={}".format(next_url))
return inner
def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "alex" and pwd == "alex1234":
# 設置session
request.session["user"] = user
# 獲取跳到登陸頁面之前的URL
next_url = request.GET.get("next")
# 如果有,就跳轉回登陸之前的URL
if next_url:
return redirect(next_url)
# 否則默認跳轉到index頁面
else:
return redirect("/index/")
return render(request, "login.html")
@check_login
def logout(request):
# 刪除所有當前請求相關的session
request.session.delete()
return redirect("/login/")
@check_login
def index(request):
current_user = request.session.get("user", None)
return render(request, "index.html", {"user": current_user})
Session版登錄驗證
django session在創建數據的時候是針對瀏覽器的
能夠作為數據庫的有如下幾種:
數據庫軟件
文件
內存
token:加密字符串
用加密算法將字符串處理成密文字符
django中間件
django中間件簡介
在django項目文件中的settings.py文件中,有一列表MIDDLEWARE就是中間件,默認有7項:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
只要你想要做一些網站的全局性功能 你都應該考慮使用django的中間件
1.全局的用戶登錄校驗
2.全局的用戶訪問頻率校驗
3.全局的用戶權限校驗() 20行代碼 100+ RBAC
據說:在所有框架中,django的中間件是最完善的
5個自定義方法
django支持用戶自定義中間件,給出了5個可以自定義的方法:
1、process_request
請求來的時候會按照從上往下的順序 依次執行settings配置文件中每一個中間件內部定義的process_request方法,如果中間件內部沒有該方法 直接跳過執行下一個中間件.
任意中間件一旦返回了HttpResponse對象,name請求會立即停止前進,然后原路返回
2、process_response
2.1 響應走的時候會按照從下往上的順序,依次執行settings配置文件中每一個中間件內部定義的process_response方法。
2.2 該方法必須有兩個形參, 並且必須返回response形參,不返回就會報錯
2.3 該方法返回什么(HttpResponsed對象) 前端獲得的就是什么
注意:當process_request方法直接返回HttpResponse對象之后 會直接從當前中間件里面的process_respone往回走,沒有執行的中間件都不會再執行
3、process_view(self, request, view_name, *args, **kwargs)
3.1 路由匹配成功之后執行視圖函數之前觸發
3.2 如果該方法返回了HttpResponse對象 那么會從下往上一次經過每一個中間件里面的process_response方法
4、process_template_respose
1.當你返回的對象中含有render屬性指向的是一個render方法的時候才會觸發 從下往上的順序
def mdzz(request):
print('我是視圖函數mdzz')
def render():
return HttpResponse('你好呀 我是奇葩')
obj = HttpResponse('我很好 好的像個傻逼一樣')
obj.render = render
return obj
5、process_exception
當視圖函數中出現錯誤,會自動觸發 ,順序是從下往上。發
CRM 客戶關系管理系統
Customer Relationship Managment