Django2.0-cookie和session
cookie和session
- cookie和session使用:
web
開發發展至今,cookie
和session
的使用已經出現了一些非常成熟的方案。在如今的市場或者企業裡,一般有兩種儲存方式:- 儲存在服務端:通過
cookie
儲存一個sessionid
,然後具體的資料則是儲存在session
中。如果使用者已經登入,則伺服器會在cookie
中儲存一個sessionid
,下次再次請求的時候,會把該sessionid
攜帶上來,伺服器根據sessionid
在session
庫中獲取使用者的session
資料。就能知道該使用者到底是誰,以及之前儲存的一些狀態資訊。這種專業術語叫做server side session
Django
把session
資訊預設儲存到資料庫中,當然也可以儲存到其他地方,比如快取中,檔案系統中等。儲存在伺服器的資料會更加的安全,不容易被竊取。但儲存在伺服器也有一定的弊端,就是會佔用伺服器的資源,但現在伺服器已經發展至今,一些session
資訊還是綽綽有餘的。 - 將
session
資料加密,然後儲存在cookie
中。這種專業術語叫做client side session
。flask
框架預設採用的就是這種方式,但是也可以替換成其他形式。
- 儲存在服務端:通過
在django中操作cookie和session
操作cookie
設定cookie
設定cookie
是設定值給瀏覽器的。因此需要通過response
cookie
可以通過response.set_cookie
來設定,這個方法的相關引數如下:
-
key
:這個cookie
的key
。 -
value
:這個cookie
的value
。 -
max_age
:最長的生命週期。單位是秒。 -
expires
:過期時間。跟max_age
是類似的,只不過這個引數需要傳遞一個具體的日期,比如datetime
或者是符合日期格式的字串。如果同時設定了expires
和max_age
,那麼將會使用expires
的值作為過期時間。 -
path
:對域名下哪個路徑有效。預設是對域名下所有路徑都有效。 -
domain
:針對哪個域名有效。預設是針對主域名下都有效,如果只要針對某個子域名才有效,那麼可以設定這個屬性. -
secure
:是否是安全的,如果設定為True
,那麼只能在https
協議下才可用。 -
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
刪除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
獲取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 makemigration
和python 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
常用的方法如下:
-
get()
:用來從session
中獲取指定值。 -
pop()
:從session
中返回key對應的值,且置資料庫中django_session
表的session_data
欄位為加密後的空 -
keys()
:從session
中獲取所有的鍵。 -
items()
:從session
中獲取所有的值。 -
clear()
:清除當前這個使用者的session
資料。且置資料庫中django_session
表的session_data
欄位為加密後的空 -
flush()
:刪除session
並且刪除在資料庫中儲存的session_id
,一般在登出的時候用得比較多。 -
set_expiry(value)
:設定過期時間。- 整形:代表秒數,表示多少秒後過期。
0
:代表只要瀏覽器關閉,session
就會過期。None
:會使用全域性的session
配置。- 在
settings.py
中可以設定SESSION_COOKIE_AGE
來配置全域性的過期時間。 - 如果沒有設定,則預設是
1209600
秒,也就是2周的時間。
- 在
-
clear_expired()
:清除過期的session
。Django
並不會清除過期的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")
-
執行
修改session的儲存機制
預設情況下,session
資料是儲存到資料庫中的。當然也可以將session
資料儲存到其他地方。可以通過設定SESSION_ENGINE
來更改session
的儲存位置,這個可以配置為以下幾種方案:
-
django.contrib.sessions.backends.db
:使用資料庫。預設就是這種方案。 -
django.contrib.sessions.backends.file
:使用檔案來儲存session。 -
django.contrib.sessions.backends.cache
:使用快取來儲存session。想要將資料儲存到快取中,前提是你必須要在settings.py
中配置好CACHES
,並且是需要使用Memcached
,而不能使用純記憶體作為快取。 -
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")
-
執行
-
-
django.contrib.sessions.backends.signed_cookies
:將session
資訊加密後儲存到瀏覽器的cookie
中。這種方式要注意安全,建議設定SESSION_COOKIE_HTTPONLY=True
,那麼在瀏覽器中不能通過js
來操作session
資料,並且還需要對settings.py
中的SECRET_KEY
進行保密,因為一旦別人知道這個SECRET_KEY
,那麼就可以進行解密。另外還有就是在cookie
中,儲存的資料不能超過4k
。