Django中cookie和session使用

cookie

  1. 什麼是cookie? Cookie 是瀏覽器訪問服務器後,服務器傳給瀏覽器的一段數據。瀏覽器須要保存這段數據,不得輕易刪除。 此後每次瀏覽器訪問該服務器,都必須帶上這段數據html

  2. cookie的原理 由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣服務器就能經過Cookie的內容來判斷這個是「誰」了python

  3. cookie的做用是什麼?redis

    • 識別用戶身份
    • 記錄歷史
  4. 使用方法數據庫

    • 設置cookie:
      • response.set_cookie('key', 'value')
      • response.set_signed_cookie(key, value, salt='', max_age=None, ...) 參數
        • key, 鍵
        • value, 值
        • max_age=None,超時時間
        • expires=None, 超時時間(IE瀏覽器)
        • path='/', cookie生效的路徑。特殊的:根路徑的cookie能夠被任何url的頁面訪問
        • domain=None, Cookie生效的域名
        • secure=False, https傳輸
        • httponly=False 只能http協議傳輸,沒法被JavaScript獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋
    • 獲取cookie:
      • request.COOKIES.get('key')
      • request.COOKIES['key']
      • request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    • 刪除cookie: response.delete_cookie("cookie_key",path="/",domain=name)
  5. cookie的優缺點 優勢:數據存儲在客戶端。減輕服務端的壓力,提升網站的性能 缺點:安全性不高,在客戶端很容易被查看或破解用戶會話信息django

  6. cookie版登陸校驗瀏覽器

def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":
            # 已經登陸的用戶...
            return func(request, *args, **kwargs)
        else:
            # 沒有登陸的用戶,跳轉剛到登陸頁面
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        passwd = request.POST.get("password")
        if username == "xxx" and passwd == "dashabi":
            next_url = request.GET.get("next")
            if next_url and next_url != "/logout/":
                response = redirect(next_url)
            else:
                response = redirect("/class_list/")
            response.set_signed_cookie("login", "yes", salt="SSS")
            return response
    return render(request, "login.html")

session

  1. 什麼是session 因爲cookie存放在用戶瀏覽器上,因此若是將一些重要數據存在cookie中就會形成安全隱患,且瀏覽器中cookie有大小限制,最大4K,因此使用session,將重要數據保存在服務器端,使用cookie將sessionid存放在瀏覽器中,訪問服務器是自動帶上sessionid,服務器根據sessionid進行判斷用戶是誰。緩存

  2. 使用方法安全

    • 設置session:服務器

      • response.session['key'] = value
      • response.session.setdefault('key', 'value')
    • 獲取sessioncookie

      • request.session.get('key', None)
      • request.session['key']
    • 刪除session

      • del request.session['key']
    • 其餘方法

      • request.session.keys()
      • request.session.values()
      • request.session.items()
      • request.session.iterkeys()
      • request.session.itervalues()
      • request.session.iteritems()
      • request.session.session_key 會話session的key
      • request.session.clear_expired() 將全部Session失效日期小於當前日期的數據刪除
      • request.session.exists("session_key") 檢查會話session的key在數據庫中是否存在
      • request.session.delete() 刪除當前會話的全部Session數據
      • request.session.flush() 刪除當前的會話數據並刪除會話的Cookie
      • request.session.set_expiry(value)
        • 若是value是個整數,session會在些秒數後失效。
        • 若是value是個datatime或timedelta,session就會在這個時間後失效。
        • 若是value是0,用戶關閉瀏覽器session就會失效。
        • 若是value是None,session會依賴全局session失效策略。

可以使用django-redis模塊進行session和cache操做,相關配置以下

# 使用redis做爲Django緩存數據庫
CACHES = {
	"default": {
		"BACKEND": "django_redis.cache.RedisCache",
		"LOCATION": "redis://localhost:6379/3",
		"OPTIONS": {
			"CLIENT_CLASS": "django_redis.client.DefaultClient",
		}
	}
}
# 使用redis存儲session。 
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

cookie 和session 的區別:

一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙 考慮到安全應當使用session。

三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能 考慮到減輕服務器性能方面,應當使用COOKIE。

四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。

相關文章
相關標籤/搜索