django----cookie與session 和 中間件

[toc]html

cookie與session簡介及操做

cookie

保存在客戶端瀏覽器上的鍵值對前端

雖然cookie是保存在客戶端瀏覽器上的鍵值對 可是是服務端設置的 瀏覽器有權禁止cookie的寫入python

django中操做cookie

# 小白必回三板斧
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超時時間

# 如何設置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請求的部分數據庫

刪除cookie

.....
obj = redirect('/login/')
obj.delete_cookie('k1')
return obj

session

保存在服務端上面的鍵值對 session的工做機制是須要依賴於cookie的django

session操做

# 設置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後端

爲了數據的安全 數據庫中不會明文暴露用戶信息 因此是密文瀏覽器

設置 key value發生了什麼?

1.django內部自動幫你調用算法生成一個隨機字符串安全

  1. 在django session添加數據 (數據也是加密的) >>> 隨機字符串 加密後的數據 失效時間cookie

  2. 將生產的隨機字符串放回給客戶端瀏覽器, key sessionid value 隨機字符串 sessionid:隨機字符串

get(session)發生了什麼?

​ 1.django內部會自動去請求頭裏面獲取cookie

2. 拿着`sessionid`對應的隨機字符串去`django_session`表中一一比對 
3. 若是對比上了 會將隨機字符串對應的數據取出來 自動反入` request.session`中供你調用 若是沒有就是一個空字典

django session 在建立數據的時候 是針對瀏覽器的 因此只會保存一條

token

在計算機身份認證中是令牌(臨時)的意思,在詞法分析中是標記的意思。通常做爲邀請、登陸系統使用。

django中間件

django請求生命週期

生命週期

中間件

​ 相似於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)
相關文章
相關標籤/搜索