2015年7月15日 星期三

Python筆記:Django(7) Sessions

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的用法跟字典(映射型態)完全一樣,但請遵循下列規則:

  1. 使用字串作為session的鍵值
  2. 不要任意以底線作為session鍵值字串的開頭
  3. 不要對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 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秒,兩週.

沒有留言:

張貼留言