django之狀態(tài)保持-使用redis存儲(chǔ)session的例子
關(guān)于redis安裝,pip install django-redis-sessions,按照提示進(jìn)行安裝相關(guān)的服務(wù)端
和客戶端.
django版本1.8.2, Python版本2.7.12
1 進(jìn)入虛擬環(huán)境h1
workon h1
2 創(chuàng)建一個(gè)項(xiàng)目test應(yīng)用booktest
django-admin startproject test
3 創(chuàng)建應(yīng)用booktest
進(jìn)入項(xiàng)目test目錄,創(chuàng)建應(yīng)用booktest,這個(gè)booktest應(yīng)用目錄和manage.py在 同級(jí)目錄下 python manage.py startapp booktest
4 定義一個(gè)session1視圖來(lái)匹配url /booktest/session1/時(shí),使用templates/booktest
目錄下的,模板session1.html來(lái)展示頁(yè)面.
1 視圖session1的代碼如下:
from django.shortcuts import render def session1(request): uname = None context = {'uname':uname} return render(request, 'booktest/session1.html', context)
2 配置url
1 根級(jí)url配置文件test/urls.py代碼如下:
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^booktest/', include('booktest.urls')), ]
2 應(yīng)用booktest下面的url配置文件booktest/urls.py代碼如下:
from django.conf.urls import url import views urlpatterns = [ url(r'^session1/$', views.session1), ]
5 創(chuàng)建模板并進(jìn)行設(shè)置路徑,在項(xiàng)目目錄test下面新建一個(gè)templates目錄作為模板目錄
,在templates目錄下面創(chuàng)建booktest目錄,在booktest目錄下面創(chuàng)建一個(gè)模板文件
session1.html,
1 模板session1.html里面的body代碼如下:
你好:{{uname}} <br> <a href="/booktest/session2/" rel="external nofollow" >登錄</a> <br> <a href="/booktest/session3/" rel="external nofollow" >退出</a>
2 對(duì)模板在settings.py進(jìn)行路徑設(shè)置
'DIRS': [os.path.join(BASE_DIR, 'templates')],
6 此時(shí)可以進(jìn)行開(kāi)發(fā)測(cè)試 ,終端輸入python manage.py runserver,按住ctrl鍵的同時(shí)
點(diǎn)擊 http://127.0.0.1:8000進(jìn)入一個(gè)頁(yè)面,在瀏覽器輸入以下url http://127.0.0.1:8000/booktest/session1/ 回車(chē)后結(jié)果如下
你好:None 登錄 退出
7 創(chuàng)建點(diǎn)擊登錄鏈接對(duì)應(yīng)的視圖session2及對(duì)url進(jìn)行配置
1 視圖session2代碼如下: def session2(request): return render(request, 'booktest/session2.html') 2 booktest/urls.py的應(yīng)用url配置,添加如下代碼: url(r'^session2/$', views.session2), 3 在templates/booktest目錄下創(chuàng)建登錄表單對(duì)應(yīng)的模板文件session2.html body代碼如下: <form action="/booktest/session2_handle/" method="post"> 用戶名: <input type="text" name="uname"> <br> <input type="submit" value="提交"> </form>
8 點(diǎn)擊登錄鏈接,進(jìn)入表單頁(yè)面,填寫(xiě)用戶名提交,發(fā)現(xiàn)會(huì)以下報(bào)錯(cuò):
1 OperationalError at /booktest/session2_handle/ no such table: django_session 解決辦法:在test/settins.py添加以下代碼,以保證session數(shù)據(jù)保存到redis # SESSION_ENGINE = 'redis_sessions.session' # SESSION_REDIS_HOST = 'localhost' # SESSION_REDIS_PORT = '6379' # SESSION_REDIS_DB = '0' # SESSION_REDIS_PASSWORD = '' # SESSION_REDIS_PREFIX = 'session' 使用django-admin startproject test默認(rèn)會(huì)開(kāi)啟session. 2 Forbidden (403) CSRF verification failed. Request aborted. 解決方法:在test/settins.py里面把 MIDDLEWARE_CLASSES的值里面以下代碼注釋 'django.middleware.csrf.CsrfViewMiddleware',
9 創(chuàng)建對(duì)表單提交處理的視圖session2_handle,并進(jìn)行相關(guān)的url配置
1 session2_handle視圖代碼如下,要導(dǎo)入redirect
from django.shortcuts import redirect def session2_handle(request): uname = request.POST['uname'] request.session['myname'] = uname return redirect('/booktest/session1/') 由于http協(xié)議是無(wú)狀態(tài)的,所以利用session來(lái)完成狀態(tài)保持,把表單里面 用戶名輸入的值賦值給類字典對(duì)象request.session里面的鍵 'myname' 修改視圖session2對(duì)應(yīng)的代碼,把session類字典里面的鍵賦值給uname,使用 get方法可以避免uname = request.session['maname']在點(diǎn)擊退出時(shí)報(bào)錯(cuò). KeyError at /booktest/session1/ 'myname' uname = request.session.get('myname', '未登錄')
2 booktest應(yīng)用下的視圖session2_handel對(duì)應(yīng)的url配置如下
url(r'^session2_handle/$', views.session2_handle),
10 創(chuàng)建點(diǎn)擊退出鏈接對(duì)應(yīng)的視圖session3,并對(duì)相關(guān)的url進(jìn)行配置
1 視圖session3代碼如下,作用刪除session回話,并重定向到/booktest/session1/ def session3(request): del request.session['myname'] return redirect('/booktest/session1/') 2 應(yīng)用下視圖session3對(duì)應(yīng)的url配置如下: url(r'^session3', views.session3)
11 終端輸入python manage.py runserver 進(jìn)行開(kāi)發(fā)測(cè)試
1 當(dāng)輸入url是http://127.0.0.1:8000/booktest/session1/時(shí) ,顯示如下
你好:未登錄 登錄 退出
2 點(diǎn)擊登錄鏈接,進(jìn)入到表單頁(yè)面http://127.0.0.1:8000/booktest/session2/
用戶名: 提交
3 輸入用戶名ff,點(diǎn)擊提交按鈕,則重定向到
http://127.0.0.1:8000/booktest/session1/ 你好:ff 登錄 退出
4 點(diǎn)擊退出鏈接,也重定向到/booktest/session1/對(duì)應(yīng)的頁(yè)面,同時(shí)刪除會(huì)話
你好:未登錄 登錄 退出
5 在redis觀察session類字典里面的鍵值對(duì)
sudo service redis-server start sudo ps ajx|grep redis redis-cli keys * 查看所有的鍵 get 'myname' 查看鍵myname對(duì)應(yīng)值, get mcp20n5r2lcbzb1rqjw2mpqe2lakjnpc 查看該鍵對(duì)應(yīng)的值如下,拿到在線base64進(jìn)行解碼,即可 "NzI4MzA2MmJlY2UxOWI2YWFlNjc2ZWZjMTY3NDE0OTJiMWFlMzgyNTp7Im15bmFtZSI6ImZmIn0=" 解碼后7283062bece19b6aae676efc16741492b1ae3825:{"myname":"ff"} 由此可見(jiàn),可以使用redis來(lái)存儲(chǔ)session,可以實(shí)現(xiàn)http狀態(tài)保持.
以上這篇django之狀態(tài)保持-使用redis存儲(chǔ)session的例子就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的完整代碼(面向?qū)ο?
這篇文章主要介紹了Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的完整代碼(面向?qū)ο?,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Python OpenCV實(shí)現(xiàn)基本圖形繪制
這篇文章主要介紹了Python OpenCV實(shí)現(xiàn)基本圖形繪制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04使用python編寫(xiě)udp協(xié)議的ping程序方法
下面小編就為大家分享一篇使用python編寫(xiě)udp協(xié)議的ping程序方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python實(shí)現(xiàn)帶GUI界面的手寫(xiě)數(shù)字識(shí)別
這篇文章主要介紹了如何通過(guò)Python實(shí)現(xiàn)帶GUI界面的手寫(xiě)數(shù)字識(shí)別,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下2022-01-01django框架使用orm實(shí)現(xiàn)批量更新數(shù)據(jù)的方法
這篇文章主要介紹了django框架使用orm實(shí)現(xiàn)批量更新數(shù)據(jù)的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Django基于orm操作數(shù)據(jù)庫(kù)更新數(shù)據(jù)的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-06-06python實(shí)現(xiàn)自動(dòng)生成SQL語(yǔ)句
在數(shù)據(jù)處理和管理中,SQL(Structured?Query?Language)是一種非常重要的語(yǔ)言,本文主要介紹了如何使用python實(shí)現(xiàn)自動(dòng)生成SQL語(yǔ)句,需要的可以參考下2024-04-04