session與cookie,django中間件

0819自我總結

一.session與cookie

1.django設置session

request.session['name'] = username
request.session['age'] = 13
會自動生成一個sessionid爲key:{"name":'username', 'age':12}爲值的key,在django中後面值部分會進行加密

2.獲取session

request.session.get('name')

3.django中五種session設置

1.數據庫session

a. 配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默認)
     
    SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認)
    SESSION_COOKIE_PATH = "/"   # Session的cookie保存的路徑(默認)
    SESSION_COOKIE_DOMAIN = None    # Session的cookie保存的域名(默認)
    SESSION_COOKIE_SECURE = False    # 是否Https傳輸cookie(默認)
    SESSION_COOKIE_HTTPONLY = True   # 是否Session的cookie只支持http傳輸(默認)
    SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)(默認)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否關閉瀏覽器使得Session過時(默認)
    SESSION_SAVE_EVERY_REQUEST = False  # 是否每次請求都保存Session,默認修改以後才保存(默認)
 
 
 
b. 使用
 
    def index(request):
        # 獲取、設置、刪除Session中數據
        request.session['k1']
        request.session.get('k1',None)
        request.session['k1'] = 123
        request.session.setdefault('k1',123) # 存在則不設置
        del request.session['k1']
 
        # 全部 鍵、值、鍵值對
        request.session.keys()
        request.session.values()
        request.session.items()
        request.session.iterkeys()
        request.session.itervalues()
        request.session.iteritems()
 
 
        # 用戶session的隨機字符串
        request.session.session_key
 
        # 將全部Session失效日期小於當前日期的數據刪除
        request.session.clear_expired()
 
        # 檢查 用戶session的隨機字符串 在數據庫中是否
        request.session.exists("session_key")
 
        # 刪除當前用戶的全部Session數據
        request.session.delete("session_key")
 
        request.session.set_expiry(value)
            * 若是value是個整數,session會在些秒數後失效。
            * 若是value是個datatime或timedelta,session就會在這個時間後失效。
            * 若是value是0,用戶關閉瀏覽器session就會失效。
            * 若是value是None,session會依賴全局session失效策略。

2.緩存session

a.配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置
 
 
    SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
    SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路徑
    SESSION_COOKIE_DOMAIN = None      # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False     # 是否Https傳輸cookie
    SESSION_COOKIE_HTTPONLY = True    # 是否Session的cookie只支持http傳輸
    SESSION_COOKIE_AGE = 1209600      # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False     # 是否關閉瀏覽器使得Session過時
    SESSION_SAVE_EVERY_REQUEST = False      # 是否每次請求都保存Session,默認修改以後才保存
 
 
 
b. 使用
 
    同上

3.文件session

a. 配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None  # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
 
 
    SESSION_COOKIE_NAME = "sessionid"   # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
    SESSION_COOKIE_PATH = "/"   # Session的cookie保存的路徑
    SESSION_COOKIE_DOMAIN = None   # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False    # 是否Https傳輸cookie
    SESSION_COOKIE_HTTPONLY = True     # 是否Session的cookie只支持http傳輸
    SESSION_COOKIE_AGE = 1209600       # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False   # 是否關閉瀏覽器使得Session過時
    SESSION_SAVE_EVERY_REQUEST = False   # 是否每次請求都保存Session,默認修改以後才保存
 
b. 使用
 
    同上

4.緩存+數據庫Session

a. 配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
 
b. 使用
 
    同上

5.加密cookie sessionhtml

a. 配置 settings.py
     
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
 
b. 使用
 
    同上

4.session與cookie之間的關係

在網站中,http請求是無狀態的。也就是說即便第一次和服務器鏈接後而且登陸成功後,第二次請求服務器依然不能知道當前請求是哪一個用戶。cookie的出現就是爲了解決這個問題,第一次登陸後服務器返回一些數據(cookie)給瀏覽器,而後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器經過瀏覽器攜帶的數據就能判斷當前用戶是哪一個了。cookie存儲的數據量有限,不一樣的瀏覽器有不一樣的存儲大小,但通常不超過4KB。所以使用cookie只能存儲一些小量的數據。python

二、session:

session和cookie的做用有點相似,都是爲了存儲用戶相關的信息。不一樣的是,cookie是存儲在本地瀏覽器,而session存儲在服務器。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有必定的弊端,就是會佔用服務器的資源,但如今服務器已經發展至今,一些session信息仍是綽綽有餘的。數據庫

3.二者傳輸的關係

1.客戶端第一請求,服務端會發送登錄頁面過去django

2.客戶第二次請求並提交用戶名和密碼後,服務端會向客戶端回寫一個cookie值瀏覽器

3.若是咱們設置了session,則會向客戶端回寫一個 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'},它會保存在客戶端緩存

4.服務端會將客戶的隱私信息保存在了服務端的數據庫中, 也就是session保存在了數據庫中,默認放在django_session表中:{"dsjnalndjskanjdksa" : {"name":'jojo', 'age':12, 'addr':'dsabdsa'}},也就是以session值:用戶信息的形式存儲安全

5.咱們能夠理解爲cookie的value值就是session的key,當咱們再次向服務端發起請求時,服務端會經過sessionid來比對信息,而後返回用戶信息服務器

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')

        if username == 'jojo' and pwd == '123':
            # 設置cookie
            obj = redirect('/test/')
            obj.set_cookie('k1', 'abd')
            ### 向客戶端回寫一個cookie值
            '''
                1. 向客戶端回寫一個 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'}
                2. 將客戶的隱私信息保存在了服務端的數據庫中, 也就是session保存在了數據庫中
                    默認放在django_session表中
                    {"dsjnalndjskanjdksa" : {"name":'jojo', 'age':12, 'addr':'dsabdsa'}}
            '''
            # 設置session
            request.session['name'] = username
            request.session['age'] = 13
            
            # 獲取session
            request.session.get('name')
            
            return redirect('/test/')
        else:
            return render(request, 'login.html')

二.中間件

原理圖總

自定製中間件

中間件能夠定義五個方法,分別是:(主要的是process_request和process_response)cookie

  • process_request(self,request)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_response(self, request, response)

以上方法的返回值能夠是None或一個HttpResponse對象,若是是None,則繼續按照django定義的規則向後繼續執行,若是是HttpResponse對象,則直接將該對象返回給用戶。session

process_request

process_request有一個參數,就是request,這個request和視圖函數中的request是同樣的(在交給Django後面的路由以前,對這個request對象能夠進行一系列的操做)。

因爲request對象是同樣的,因此咱們能夠對request對象進行一系列的操做,包括request.變量名=變量值,這樣的操做,咱們能夠在後續的視圖函數中經過相同的方式便可獲取到咱們在中間件中設置的值。

它的返回值能夠是None也能夠是HttpResponse對象。返回值是None的話,按正常流程繼續走,交給下一個中間件處理,若是是HttpResponse對象,Django將不執行視圖函數,而將相應對象返回給瀏覽器。

process_response

多箇中間件中的process_response方法是按照MIDDLEWARE中的註冊順序倒序執行的,也就是說第一個中間件的process_request方法首先執行,而它的process_response方法最後執行,最後一箇中間件的process_request方法最後一個執行,它的process_response方法是最早執行。

process_view

process_view(self, request, view_func, view_args, view_kwargs)

該方法有四個參數

  • request是HttpRequest對象。
  • view_func是Django即將使用的視圖函數。 (它是實際的函數對象,而不是函數的名稱做爲字符串。)
  • view_args是將傳遞給視圖的位置參數的列表.
  • view_kwargs是將傳遞給視圖的關鍵字參數的字典。 view_args和view_kwargs都不包含第一個視圖參數(request)。

Django會在調用視圖函數以前調用process_view方法。

它應該返回None或一個HttpResponse對象。 若是返回None,Django將繼續處理這個請求,執行任何其餘中間件的process_view方法,而後在執行相應的視圖。 若是它返回一個HttpResponse對象,那麼將不會執行Django的視圖函數,而是直接在中間件中掉頭,倒敘執行一個個process_response方法,最後返回給瀏覽器

中間件執行流程

請求到達中間件以後,先按照正序執行每一個註冊中間件的process_request方法,process_request方法返回的值是None,就依次執行,若是返回的值是HttpResponse對象,再也不執行後面的process_request方法,而是執行當前對應中間件的process_response方法(注意不是掉頭執行全部的process_response方法),將HttpResponse對象返回給瀏覽器。也就是說:若是MIDDLEWARE中註冊了6箇中間件,執行過程當中,第3箇中間件返回了一個HttpResponse對象,那麼第4,5,6中間件的process_request和process_response方法都不執行,順序執行3,2,1中間件的process_response方法。

ZOZRu4.png

process_request方法都執行完後,匹配路由,找到要執行的視圖函數,先不執行視圖函數,先執行中間件中的process_view方法,process_view方法返回None,繼續按順序執行,全部process_view方法執行完後執行視圖函數。假如中間件3 的process_view方法返回了HttpResponse對象,則4,5,6的process_view以及視圖函數都不執行,直接從最後一箇中間件,也就是中間件6的process_response方法開始倒序執行。

ZOZWDJ.png

相關文章
相關標籤/搜索