Django使用sessionid
區分用戶。session信息需要做持久化處理,可以使用文件、數據庫,或者專門的服務器保存。
配置session信息
修改settings.py
文件,配置Django中使用的session信息。查看詳細文檔。
SESSION_ENGINE = 'Django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/var/django/session'
SESSION_COOKIE_AGE = 7200
下面是一些常見的選項。
- SESSION_ENGINE - 配置session引擎,默認為
Django.contrib.sessions.backends.db
。Django使用該引擎保存sessionid,除了Django.contrib.sessions.backends.cache
,其他引擎都會做數據持久化,把sessionid
保存在數據庫或文件中。- Django.contrib.sessions.backends.db
- Django.contrib.sessions.backends.file
- Django.contrib.sessions.backends.cache
- Django.contrib.sessions.backends.cached_db
- Django.contrib.sessions.backends.signed_cookies
- SESSION_FILE_PATH - 使用
Django.contrib.sessions.backends.file
時,配置存儲路徑。 - SESSION_COOKIE_NAME - 配置cookie中session UID的名字。默認為
sessionid
。 - SESSION_COOKIE_AGE - 配置session過期時間。
javascript刪除sessionid失效
在Django中,實現用戶退出功能。最初的方案是在當logout時,在js中刪除cookie信息。使用chrome測試時,發現js不能刪除cookie中的sessionid
,造成用戶不能正常退出。
查詢Django文檔,發現這是SESSION_COOKIE_HTTPONLY
引起的。
- SESSION_COOKIE_HTTPONLY - 設置為
True
時,js不能訪問session cookie。在js中不能刪除sessionid。默認為True
。
function() {
...
CommonUtil.AjaxUtil.ajaxPost(
'/logout/',
null,
function(result) {
deleteCookie('sessionid', '/');
window.location = '/';
}
);
...
}
function deleteCookie(name, path)
{
var exp = new Date();
exp.setDate(exp.getDate() - 100);
var cval=getCookie(name);
if(cval!=null)
document.cookie= name + "=" + cval + ";expires=" + exp.toGMTString() + ((path == undefined) ? "" : ";path=" + path);
}
當設置了SESSION_COOKIE_HTTPONLY = True
,需要在views.py
中刪除sessionid
。從Django.contrib.auth
中引入views
,調用logout()
函數,刪除登錄用戶的sessionid
。
from Django.contrib.auth import views as auth_views
def logout(request):
if request.method == "POST":
auth_views.logout(request)
return HttpResponse(json.dumps({"status": True}), content_type='application/json')
session工作原理
用戶第一次訪問Django時,Django為每個用戶生成一個
sessionid
,把sessionid
下發到瀏覽器。-
Django把生成的sesion相關信息保存在
SESSION_ENGINE
中。本例中,把session信息保存在文件中,文件名以sessionid
開頭,后接session UID
,格式為sessionid<sesssion uid>
。$ ls /tmp sessionidqj8bevv269sxt7dzqlrny1gcw7e1hkrg
-
文件中保存的session信息除了
sessionid
以外,還有使用request.session['username'] = username
加入的信息。文件使用base64
格式編碼。$ cat /tmp/sessionidqj8bevv269sxt7dzqlrny1gcw7e1hkrg
YWZhN2M3ZWEzNjk0YWU2NjUwZDIyNzdlNTA5NDc0NGY3NzMzYzlkOTp7InVzZXJuYW1lIjoiYWRtaW4iLCJ1aWQiOiIyNjdiNzliYS0yMTNhLTQ3NDItYjA0My1kMjMzMDVhMWQ1YmUiLCJ0b2tlbiI6IjVkOTFhMjM1ZDU3ODRiODk4ZmExMDUyZGQ1ZmZiNzkwODI2N2I3OWJhMjEwMTEyNjUyMTNhNDc0MmNhZWY0ZThkYjA0M2QyMzM4Njk5ZTAwMzA1YTFkNWJlNmNmM2Q1OWIiLCJyb2xlIjoiYWRtaW4iLCJpc3N1ZV90aW1lIjoiMTQ5MDg1NzIyNiIsImV4cGlyZV90aW1lIjoiMTgwMCJ9Cg==
```
轉碼后,得到文件內容。
```shell
$ base64 -d /tmp/sessionidqj8bevv269sxt7dzqlrny1gcw7e1hkrg
afa7c7ea3694ae6650d2277e5094744f7733c9d9:{"username":"admin","uid":"267b79ba-213a-4742-b043-d23305a1d5be","token":"5d91a235d5784b898fa1052dd5ffb7908267b79ba21011265213a4742caef4e8db043d2338699e00305a1d5be6cf3d59b","role":"admin","issue_time":"1490857226","expire_time":"1800"}
```
-
在
views.py
中調用logout()
時,Django會刪除內存中的sessionid
,同時也會刪除數據庫中的記錄或磁盤上的文件。本例中,會刪除/tmp/sessionidqj8bevv269sxt7dzqlrny1gcw7e1hkrg
文件。from Django.contrib.auth import views as auth_views def logout(request): if request.method == "POST": auth_views.logout(request) return HttpResponse(json.dumps({"status": True}), content_type='application/json')