Cookies
儲存在瀏覽器中的小段訊息,它用來記住一些暫時資訊並且能讓使用者跨頁面使用。
設置cookies
設定一個url pattern並且讓他對應到視圖函式set_c
:
def set_c(request):
response = HttpResponse('Set your lucky_number as 8')
response.set_cookie('lucky_number',8)
return response
要設置cookies,我們要使用HttpResponse
物件的set_cookie
方法,第一個參數指定了cookie的名稱(鍵),第二個參數指定了cookie的值,set_cookie
方法還有許多的參數可以調整,可以參考Django的Documents。
讀取cookies
cookie的取值一樣用字典取值的方法向HttpRequest
物件的COOKIES屬性拿取,COOKIES中儲存了所有cookies的鍵值對資訊。
def get_c(request):
if 'lucky_number' in request.COOKIES:
return HttpResponse('Your lucky_number is {0}'.format(request.COOKIES['lucky_number']))
else:
return HttpResponse('No cookies.')
但是Cookie存在兩個問題:
1. cookies是儲存在瀏覽器端的,而用戶可以關閉cookies的功能這會導致許多行為無效化
2. Http協定是明文協定,cookies在傳輸過程中容易被攔截、竄改、偽造等,並不安全
Sessions
session之所以能夠解決cookies的問題,便在於他是把資訊存在伺服端,
兩種方式:
1. session會透過cookie儲存一段用以辨識的ID,cookie可以跨頁面生存,session自然也可以囉,透過這個ID,指令搞便可以去伺服端將我們需要的資料取出來。這個方式跟只使用cookie來儲存資訊的方式不同,因為現在這個cookie只儲存session的ID(而且是加密過的),我們的資料不會直接暴露給瀏覽器端。
2. 透過url查詢字符的方式,將session ID附上,這對於cookie功能被瀏覽器端關閉時特別有用。
安裝Session App
#mysite/mysite/settings.py
...
INSTALLED_APPS = (
...
'django.contrib.sessions', # 確認有安裝
...
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware', # 確認有安裝
'django.middleware.locale.LocaleMiddleware',
...
)
...
使用Session
def use_session(request):
request.session['lucky_number'] = 8 # 設置lucky_number
if 'lucky_number' in request.session:
lucky_number = request.session['lucky_number'] # 讀取lucky_number
response = HttpResponse('Your lucky_number is '+lucky_number)
del request.session['lucky_number'] # 刪除lucky_number
return response
session的用法跟字典(映射型態)完全一樣,但請遵循下列規則:
- 使用字串作為session的鍵值
- 不要任意以底線作為session鍵值字串的開頭
- 不要對session及其屬性賦值
>>> s.expire_date
datetime.datetime(2014, 8, 30, 3, 55, 42, 878739, tzinfo=<UTC>)
#expire_date是該session的有效期限,當超過這個時間時,session即失效。
>>> s.session_data
u'MDZmZGI2ZjZlNTNjYjc2MTlmMDMxM2Y5NTRlNGYzZTg2M2Q0NWJhNjp7Il9hdXRoX3VzZXJfYmFja2VuZCI6ImRqYW5nby5jb250cmliLmF1dGguYmFja2VuZHMuTW9kZWxCYWNrZW5kIiwiX2F1dGhfdXNlcl9pZCI6MX0='
>>> s.get_decoded()
{u'_auth_user_backend': u'django.contrib.auth.backends.ModelBackend',
u'_auth_user_id': 1}
#session_data是經過編碼的,我們必須利用get_decoded()方法來取得編碼後的資料,而這會是一個字典
Session cookie
session ID 是透過cookie來保存的,這個cookie就叫session cookie。我們可以透過sessionid
這個cookie名稱來取得cookie,而他的值就是編碼後的session ID。
from django.contrib.sessions.models import Session
def session_test(request):
sid = request.COOKIES['sessionid']
s = Session.objects.get(pk=sid)
s_info = 'Session ID:' + sid + '<br>Expire_date:' + str(s.expire_date) +
'<br>Data:' + str(s.get_decoded())
return HttpResponse(s_info)
利用request.COOKIES
來取得sessionid這個cookie的值
Session的持續性
Session的持續性和有效性可以透過settings.py中的參數:SESSION_EXPIRE_AT_BROWSER_CLOSE和SESSION_COOKIE_AGE來設定。
SESSION_EXPIRE_AT_BROWSER_CLOSE
: 決定session是否在瀏覽器關閉時結束, 預設是False.
SESSION_COOKIE_AGE
: session(cookie)的有效時間,預設是1,209,600秒,兩週.
沒有留言:
張貼留言