(2018-05-12.Python從Zero到One)6熄云、(Django)Django視圖__1.3.5狀態(tài)保持

狀態(tài)保持

  • http協(xié)議是無狀態(tài)的:每次請求都是一次新的請求,不會記得之前通信的狀態(tài)
  • 客戶端與服務(wù)器端的一次通信妙真,就是一次會話
  • 實(shí)現(xiàn)狀態(tài)保持的方式:在客戶端或服務(wù)器端存儲與會話有關(guān)的數(shù)據(jù)
  • 存儲方式包括cookie缴允、session,會話一般指session對象
  • 使用cookie珍德,所有數(shù)據(jù)存儲在客戶端练般,注意不要存儲敏感信息
  • 推薦使用sesison方式,所有數(shù)據(jù)存儲在服務(wù)器端锈候,在客戶端cookie中存儲session_id
  • 狀態(tài)保持的目的是在一段時(shí)間內(nèi)跟蹤請求者的狀態(tài)薄料,可以實(shí)現(xiàn)跨頁面訪問當(dāng)前請求者的數(shù)據(jù)
  • 注意:不同的請求者之間不會共享這個(gè)數(shù)據(jù),與請求者一一對應(yīng)

啟用session

  • 使用django-admin startproject創(chuàng)建的項(xiàng)目默認(rèn)啟用
  • 在settings.py文件中
項(xiàng)INSTALLED_APPS列表中添加:
'django.contrib.sessions',

項(xiàng)MIDDLEWARE_CLASSES列表中添加:
'django.contrib.sessions.middleware.SessionMiddleware',

  • 禁用會話:刪除上面指定的兩個(gè)值泵琳,禁用會話將節(jié)省一些性能消耗

使用session

  • 啟用會話后摄职,每個(gè)HttpRequest對象將具有一個(gè)session屬性,它是一個(gè)類字典對象
  • get(key, default=None):根據(jù)鍵獲取會話的值
  • clear():清除所有會話
  • flush():刪除當(dāng)前的會話數(shù)據(jù)并刪除會話的Cookie
  • del request.session['member_id']:刪除會話

用戶登錄示例

  • 操作效果如下圖:
day46_Django視圖-01.gif
  • 在views.py文件中創(chuàng)建視圖
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse

def index(request):
    uname = request.session.get('uname')
    return render(request, 'booktest/index.html', {'uname': uname})

def login(request):
    return render(request, 'booktest/login.html')

def login_handle(request):
    request.session['uname'] = request.POST['uname']
    return redirect(reverse('main:index'))

def logout(request):
    # request.session['uname'] = None
    # del request.session['uname']
    # request.session.clear()
    request.session.flush()
    return redirect(reverse('main:index'))

  • 配置url
主url:
from django.conf.urls import include, url
urlpatterns = [
    url(r'^', include('booktest.urls', namespace='main'))
]

應(yīng)用url:
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'login/$', views.login, name='login'),
    url(r'login_handle/$', views.login_handle, name='login_handle'),
    url(r'logout/$', views.logout, name='logout')
]

  • 創(chuàng)建模板index.html
<!DOCTYPE html>
<html>
<head>
    <title>首頁</title>
</head>
<body>
你好:{{uname}}
<hr/>
<a href="{%url 'main:login'%}">登錄</a>
<hr/>
<a href="{%url 'main:logout'%}">退出</a>
</body>
</html>

  • 創(chuàng)建模板login.html
<!DOCTYPE html>
<html>
<head>
    <title>登錄</title>
</head>
<body>
<form method="post" action="/login_handle/">
    <input type="text" name="uname"/>
    <input type="submit" value="登錄"/>
</form>
</body>
</html>

會話過期時(shí)間

  • set_expiry(value):設(shè)置會話的超時(shí)時(shí)間
  • 如果沒有指定获列,則兩個(gè)星期后過期
  • 如果value是一個(gè)整數(shù)谷市,會話將在values秒沒有活動后過期
  • 若果value是一個(gè)imedelta對象,會話將在當(dāng)前時(shí)間加上這個(gè)指定的日期/時(shí)間過期
  • 如果value為0击孩,那么用戶會話的Cookie將在用戶的瀏覽器關(guān)閉時(shí)過期
  • 如果value為None迫悠,那么會話永不過期
  • 修改視圖中l(wèi)ogin_handle函數(shù),查看效果
def login_handle(request):
    request.session['uname'] = request.POST['uname']
    # request.session.set_expiry(10)
    # request.session.set_expiry(timedelta(days=5))
    # request.session.set_expiry(0)
    # request.session.set_expiry(None)
    return redirect(reverse('main:index'))

存儲session

  • 使用存儲會話的方式巩梢,可以使用settings.py的SESSION_ENGINE項(xiàng)指定
  • 基于數(shù)據(jù)庫的會話:這是django默認(rèn)的會話存儲方式创泄,需要添加django.contrib.sessions到的INSTALLED_APPS設(shè)置中艺玲,運(yùn)行manage.py migrate在數(shù)據(jù)庫中安裝會話表,可顯示指定為
SESSION_ENGINE='django.contrib.sessions.backends.db'

  • 基于緩存的會話:只存在本地內(nèi)在中鞠抑,如果丟失則不能找回饭聚,比數(shù)據(jù)庫的方式讀寫更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'

  • 可以將緩存和數(shù)據(jù)庫同時(shí)使用:優(yōu)先從本地緩存中獲取,如果沒有則從數(shù)據(jù)庫中獲取
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

使用Redis緩存session

  • 會話還支持文件碍拆、純cookie若治、Memcached、Redis等方式存儲感混,下面演示使用redis存儲
  • 安裝包
pip install django-redis-sessions

  • 修改settings中的配置端幼,增加如下項(xiàng)
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'

  • 管理redis的命令
啟動:sudo redis-server /etc/redis/redis.conf
停止:sudo redis-server stop
重啟:sudo redis-server restart
redis-cli:使用客戶端連接服務(wù)器
keys *:查看所有的鍵
get name:獲取指定鍵的值
del name:刪除指定名稱的鍵
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弧满,隨后出現(xiàn)的幾起案子婆跑,更是在濱河造成了極大的恐慌,老刑警劉巖庭呜,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滑进,死亡現(xiàn)場離奇詭異,居然都是意外死亡募谎,警方通過查閱死者的電腦和手機(jī)扶关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來数冬,“玉大人节槐,你說我怎么就攤上這事」丈矗” “怎么了铜异?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秸架。 經(jīng)常有香客問我揍庄,道長,這世上最難降的妖魔是什么东抹? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任蚂子,我火速辦了婚禮,結(jié)果婚禮上府阀,老公的妹妹穿的比我還像新娘缆镣。我一直安慰自己,他們只是感情好试浙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布董瞻。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钠糊。 梳的紋絲不亂的頭發(fā)上挟秤,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音抄伍,去河邊找鬼艘刚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛截珍,可吹牛的內(nèi)容都是我干的攀甚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼岗喉,長吁一口氣:“原來是場噩夢啊……” “哼秋度!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钱床,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荚斯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后查牌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體事期,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年纸颜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兽泣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胁孙,死狀恐怖撞叨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浊洞,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布胡岔,位于F島的核電站法希,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏靶瘸。R本人自食惡果不足惜苫亦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怨咪。 院中可真熱鬧屋剑,春花似錦、人聲如沸诗眨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巍膘,卻和暖如春厂财,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峡懈。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工璃饱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肪康。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓荚恶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親磷支。 傳聞我的和親對象是個(gè)殘疾皇子谒撼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 會話(Session)跟蹤是Web程序中常用的技術(shù),用來跟蹤用戶的整個(gè)會話齐唆。常用的會話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,620評論 1 49
  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,946評論 7 186
  • 1嗤栓,定義 瀏覽器請求服務(wù)器是無狀態(tài)的。無狀態(tài)指一次用戶請求時(shí)箍邮,瀏覽器茉帅、服務(wù)器無法知道之前這個(gè)用戶做過什么,每次請求...
    曉可加油閱讀 1,063評論 0 3
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司整以,掛了不少炼吴,但最終還是拿到小米、百度樱蛤、阿里、京東剑鞍、新浪昨凡、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,255評論 11 349
  • 人人都講究情商蚁署,談?wù)撜f話之道的時(shí)代便脊,怎樣才能讓自己說的話更中聽、更讓人心悅誠服呢光戈? 1.只觀察哪痰,別評判。 我們每天...
    Q小喵閱讀 126評論 0 1