1. 程式人生 > >Django2.0-cookie和session

Django2.0-cookie和session

cookie和session

  1. cookie和session使用:web開發發展至今,cookiesession的使用已經出現了一些非常成熟的方案。在如今的市場或者企業裡,一般有兩種儲存方式:
    • 儲存在服務端:通過cookie儲存一個sessionid,然後具體的資料則是儲存在session中。如果使用者已經登入,則伺服器會在cookie中儲存一個sessionid,下次再次請求的時候,會把該sessionid攜帶上來,伺服器根據sessionidsession庫中獲取使用者的session資料。就能知道該使用者到底是誰,以及之前儲存的一些狀態資訊。這種專業術語叫做server side session
      Djangosession資訊預設儲存到資料庫中,當然也可以儲存到其他地方,比如快取中,檔案系統中等。儲存在伺服器的資料會更加的安全,不容易被竊取。但儲存在伺服器也有一定的弊端,就是會佔用伺服器的資源,但現在伺服器已經發展至今,一些session資訊還是綽綽有餘的。
    • session資料加密,然後儲存在cookie中。這種專業術語叫做client side sessionflask框架預設採用的就是這種方式,但是也可以替換成其他形式。

在django中操作cookie和session

操作cookie

設定cookie

設定cookie是設定值給瀏覽器的。因此需要通過response

的物件來設定,設定cookie可以通過response.set_cookie來設定,這個方法的相關引數如下:

  1. key:這個cookiekey

  2. value:這個cookievalue

  3. max_age:最長的生命週期。單位是秒。

  4. expires:過期時間。跟max_age是類似的,只不過這個引數需要傳遞一個具體的日期,比如datetime或者是符合日期格式的字串。如果同時設定了expiresmax_age,那麼將會使用expires的值作為過期時間。

  5. path:對域名下哪個路徑有效。預設是對域名下所有路徑都有效。

  6. domain:針對哪個域名有效。預設是針對主域名下都有效,如果只要針對某個子域名才有效,那麼可以設定這個屬性.

  7. secure:是否是安全的,如果設定為True,那麼只能在https協議下才可用。

  8. httponly:預設是False。如果為True,那麼在客戶端不能通過JavaScript進行操作。

    def index(request):
        response = HttpResponse("ok")
        expires = datetime(year=2018, month=11, day=15, hour=16,minute=5,second=0)
        # 轉化為清醒時間,時區和setting.py的TIME_ZONE有關
        expires = make_aware(expires)
        response.set_cookie("user_id", "10086", expires=expires)
        return response
    

    1

刪除cookie

通過delete_cookie即可刪除cookie。實際上刪除cookie就是將指定的cookie的值設定為空的字串,然後使用將他的過期時間設定為0,也就是瀏覽器關閉後就過期。

from django.shortcuts import HttpResponse


def index(request):
    response = HttpResponse("ok")
    response.delete_cookie("user_id")
    return response

2

獲取cookie

獲取瀏覽器傳送過來的cookie資訊。可以通過request.COOKIES來或者。這個物件是一個字典型別。比如獲取所有的cookie,那麼示例程式碼如下:

def get_cookies(request):
    cookies = request.COOKIES
    for key, value in cookies.items():
        print(key, " ", value)
    return HttpResponse("over")

操作session

django中的session預設情況下是儲存在伺服器的資料庫中的,在表中會根據sessionid來提取指定的session資料,然後再把這個sessionid放到cookie中傳送給瀏覽器儲存,瀏覽器下次在向伺服器傳送請求的時候會自動的把所有cookie資訊都發送給伺服器,伺服器再從cookie中獲取sessionid,然後再從資料庫中獲取session資料。但是在操作session的時候,這些細節壓根就不用管。只需要通過request.session即可操作。

首先要執行python manage.py makemigrationpython manage.py migrate建立資料庫和相關的表

# setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',  # session相關
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
def index(request):
   request.session.get('username')
   return HttpResponse('index')

session常用的方法如下:

  1. get():用來從session中獲取指定值。

  2. pop():從session中返回key對應的值,且置資料庫中django_session表的session_data欄位為加密後的空

  3. keys():從session中獲取所有的鍵。

  4. items():從session中獲取所有的值。

  5. clear():清除當前這個使用者的session資料。且置資料庫中django_session表的session_data欄位為加密後的空

  6. flush():刪除session並且刪除在資料庫中儲存的session_id,一般在登出的時候用得比較多。

  7. set_expiry(value):設定過期時間。

    • 整形:代表秒數,表示多少秒後過期。
    • 0:代表只要瀏覽器關閉,session就會過期。
    • None:會使用全域性的session配置。
      • settings.py中可以設定SESSION_COOKIE_AGE來配置全域性的過期時間。
      • 如果沒有設定,則預設是1209600秒,也就是2周的時間。
  8. clear_expired():清除過期的sessionDjango並不會清除過期的session,需要定期手動的清理,或者是在終端,使用命令列python manage.py clearsessions來清除過期的session

    • 例項
    # views.py
    
    def session_index(request):
        request.session["user_id"] = 10086
        request.session["user_name"] = "jack"
        print(request.session.get("user_id"))
        print(request.session.get("user_name"))
        # request.session.flush()
        return HttpResponse("ok")
    
    • 執行

      3

      4

修改session的儲存機制

預設情況下,session資料是儲存到資料庫中的。當然也可以將session資料儲存到其他地方。可以通過設定SESSION_ENGINE來更改session的儲存位置,這個可以配置為以下幾種方案:

  1. django.contrib.sessions.backends.db:使用資料庫。預設就是這種方案。

  2. django.contrib.sessions.backends.file:使用檔案來儲存session。

  3. django.contrib.sessions.backends.cache:使用快取來儲存session。想要將資料儲存到快取中,前提是你必須要在settings.py中配置好CACHES,並且是需要使用Memcached,而不能使用純記憶體作為快取。

  4. django.contrib.sessions.backends.cached_db:在儲存資料的時候,會將資料先存到快取中,再存到資料庫中。這樣就可以保證萬一快取系統出現問題,session資料也不會丟失。在獲取資料的時候,會先從快取中獲取,如果快取中沒有,那麼就會從資料庫中獲取。

    # setting.py
    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': [
                '127.0.0.1:11211',
            ]
        }
    }
    
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
    
    # views.py
    from django.shortcuts import HttpResponse
    
    def session_index(request):
        request.session["user_id"] = 10086
        request.session["user_name"] = "jack"
        print(request.session.get("user_id"))
        print(request.session.get("user_name"))
        return HttpResponse("ok")
    
    • 執行

      11

      22

      33

  5. django.contrib.sessions.backends.signed_cookies:將session資訊加密後儲存到瀏覽器的cookie中。這種方式要注意安全,建議設定SESSION_COOKIE_HTTPONLY=True,那麼在瀏覽器中不能通過js來操作session資料,並且還需要對settings.py中的SECRET_KEY進行保密,因為一旦別人知道這個SECRET_KEY,那麼就可以進行解密。另外還有就是在cookie中,儲存的資料不能超過4k