[toc]html
保存在客戶端瀏覽器上的鍵值對前端
雖然cookie
是保存在客戶端瀏覽器上的鍵值對 可是是服務端設置的 瀏覽器有權禁止cookie的寫入python
# 小白必回三板斧 obj = HttpResponse() return obj # 效果都是同樣的
# 設置cookie obj.set_cookie('key','value') # 告訴瀏覽器設置 # 獲取cookie request.COOKIES.get('key') # 獲取瀏覽器攜帶過來的cookies
# cookie的騷操做 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('username') if username == 'long' and password == '123': # 登錄成功 設置cookie obj = redirect('/home/') obj.set_cookie('k1','long') return obj return render(request, 'test.html', locals()) # 校驗用戶是否登陸 def home(requset): if request.COOKIES.get('k1'): return HttpResponse('登陸成功') return redirect('/login/')
# 如何設置cookie超時時間 obj.set_cookie('k1','v1', max_age=5) # 秒爲單位 obj.set_cookie('k1','v1', expires=5) # 秒爲單位 # 都是設置超時時間 而且都是秒爲單位 區別: 給ie瀏覽器設置cookies設置超時時間 只能用 expires參數.
# 裝飾器 from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args, **kwargs): # 判斷當前用戶是否登陸 if request.COOKIES.get('k1'): res = func(request, *args, **kwargs) return res else: current_url = request.path_info return redirect('/login/?next=%s'%current_url) return inner
request.path_info
只拿url算法
reque*st.get_full_path()
拿url 加get請求的部分數據庫
..... obj = redirect('/login/') obj.delete_cookie('k1') return obj
保存在服務端上面的鍵值對 session的工做機制是須要依賴於cookie的django
# 設置session request.session['k1'] = 'v1' # 獲取session request.session.get('k1') # 拿到隨機字符串 request.session.session_key() # 存在則不設置 request.session.setdefault('k1',123) # 檢查會話session的key在數據庫中是否存在 request.session.exists("session_key") # 刪除 request.session.delete() request.session.flush() # 只刪客戶端 這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問 例如,django.contrib.auth.logout() 函數中就會調用它。 # 設置會話Session和Cookie的超時時間 request.session.set_expiry(value) * 若是value是個整數,session會在些秒數後失效。 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 * 若是value是0,用戶關閉瀏覽器session就會失效。 * 若是value是None,session會依賴全局session失效策略。
會自動將數據存在django_session
表中 默認過時時間是 14
天後端
爲了數據的安全 數據庫中不會明文暴露用戶信息 因此是密文瀏覽器
1.django內部自動幫你調用算法生成一個隨機字符串安全
在django session添加數據 (數據也是加密的) >>> 隨機字符串 加密後的數據 失效時間cookie
將生產的隨機字符串放回給客戶端瀏覽器, key
是 sessionid
value
是 隨機字符串
sessionid:隨機字符串
1.django
內部會自動去請求頭裏面獲取cookie
2. 拿着`sessionid`對應的隨機字符串去`django_session`表中一一比對 3. 若是對比上了 會將隨機字符串對應的數據取出來 自動反入` request.session`中供你調用 若是沒有就是一個空字典
django session
在建立數據的時候 是針對瀏覽器的 因此只會保存一條
在計算機身份認證中是令牌(臨時)的意思,在詞法分析中是標記的意思。通常做爲邀請、登陸系統使用。
相似於django的保安 一共有 7 箇中間件
而且支持用戶自定義中間件
讓後暴露給用戶五個
能夠自定義的方法 隨意建立一個py文件 填代碼便可 寫完後須要 註冊 (****)
只要你想作一些網站的全局性功能 你都應該考慮使用django的中間件 好比: 全局的用戶登陸校驗, 全局的用戶訪問頻率校驗, 全局的用戶權限校驗
須要掌握:
process_request
請求來的時候觸發 參數 request
class SecurityMiddleware(MiddlewareMixin): # 他們都繼承了 middleware pass from django.utils.deprecation import MiddlewareMixin # 模塊的導入 # 寫本身的類繼承 Middleware class MyMdd1(MiddlewareMixin): def process_request(self, request): print('xxx') return HttpResponse('我是xxx的response') # 該方法一旦返回了httpresponse對象 那麼請求會馬上中止日後走原路馬上返回
process_response
響應走的時候觸發 參數 request
response
且必需要返回response
他就是後端返回給前端的數據~
class MyMdd1(MiddlewareMixin): def process_response(self, request, response): print('test') return response # 必須放回response 不返回直接報錯! # 請求來的時候是從上往下 # 響應走的時候是從下往上
須要瞭解:
process_views
參數: request
view_name
*args
**kwargs
路由匹配成功以後 執行視圖函數以前
def process_views(self, request, view_name, *args, **kwargs): return HttpResponse('xx') # 若是返回 HttpResponse 會從頭執行process_response
process_template_response
參數: request
response
當你返回的對象中含有render屬性的時候會自動觸發
def process_template_response(self, request, response) # 若是形參中有response 就必須返回response print('xxx') return response # 須要觸發須要寫個函數 def index(requset): def render(): reutrn HttpResponse('xxx') obj = HttpResponse('xxxx') obj.render = render return obj
process_exception
參數 : request
exception
當視圖函數有異常時會自動觸發 順序是 從下往上
def process_exception(self, requset, exception): print(exception)