摘要:在保存登錄狀態(tài)與注銷功能這篇文章中,我們使用了來保存,實(shí)際上默認(rèn)的功能,是客戶端,與之相對(duì)的是服務(wù)器端。今天我們來實(shí)現(xiàn)服務(wù)器端,原理很簡(jiǎn)單,實(shí)際上在編程實(shí)現(xiàn)和這篇文章中我們已經(jīng)做過了?,F(xiàn)在我們用數(shù)據(jù)庫來保存,并為其設(shè)置有效期。
在11.保存登錄狀態(tài)與注銷功能這篇文章中,我們使用了session來保存username,實(shí)際上Flask默認(rèn)的session功能,是客戶端session(client-side session),與之相對(duì)的是服務(wù)器端session(server-side session)。簡(jiǎn)單來說,這里的客戶端session是將username加密后,以cookie的形式返還給客戶端,客戶端后續(xù)訪問網(wǎng)站就攜帶著這個(gè)cookie,服務(wù)器解密cookie得到username。也就是說,如果知道了加密方法和cookie內(nèi)容,就可以解密出username,這樣是不夠安全的。
今天我們來實(shí)現(xiàn)服務(wù)器端session(server-side session),原理很簡(jiǎn)單,實(shí)際上在【python socket編程】—— 5.實(shí)現(xiàn)cookie和session這篇文章中我們已經(jīng)做過了?,F(xiàn)在我們用數(shù)據(jù)庫來保存session,并為其設(shè)置有效期。整個(gè)邏輯是這樣的:用戶登錄后,生成一個(gè)隨機(jī)字符串,將其作為session id,與對(duì)應(yīng)的username和過期時(shí)間一起存入數(shù)據(jù)庫,然后將session id作為cookie返回給客戶端,客戶端后續(xù)訪問時(shí),攜帶著含有session id的cookie,服務(wù)器通過cookie中的session id在數(shù)據(jù)庫中檢索session數(shù)據(jù),判斷登錄狀態(tài)。
建立一個(gè)sessions表(ORM模型)來存儲(chǔ)session,字段如下:
class MySession(db.Model): __tablename__ = "sessions" id = db.Column(db.Integer, primary_key=True, autoincrement=True) # s_id代表session id,也是后面返回給客戶端的cookie s_id = db.Column(db.String(24), nullable=False) username = db.Column(db.String(64), nullable=False) start_time = db.Column(db.DateTime, nullable=False) expire_time = db.Column(db.DateTime, nullable=False)
視圖函數(shù)代碼如下:
@app.route("/session/", methods=["GET", "POST"]) def test_session(): username = None if request.method == "GET": s_id = request.cookies.get("sid") if s_id: mysession = MySession.query.filter(MySession.s_id == s_id).first() if mysession and mysession.expire_time > datetime.now(): username = mysession.username return render_template("session.html", username=username) else: username = request.form.get("username") s_id = random_strings(24) now = datetime.now() expire_time = now + timedelta(seconds=10) mysession = MySession(s_id=s_id, username=username, start_time=now, expire_time=expire_time) db.session.add(mysession) db.session.commit() response = make_response(redirect(url_for("test_session"))) response.set_cookie("sid", s_id) return response
我們從POST方法講起,當(dāng)用戶POST一個(gè)username過來時(shí)(為了簡(jiǎn)單,session.html只有用戶名沒有密碼),生成一個(gè)隨機(jī)字符串(random_strings是自己編寫的一個(gè)小函數(shù))作為session id,然后獲取現(xiàn)在的時(shí)間now和過期時(shí)間expire_time(為了演示方便,過期時(shí)間是10秒之后),然后將這些信息存入MySession模型中,最后使用make_response方法生成一個(gè)response對(duì)象(這個(gè)對(duì)象有set_cookie方法,這也是Flask設(shè)置cookie的常規(guī)方法),并為其設(shè)置cookie,set_cookie第一個(gè)參數(shù)"sid"是key,第二個(gè)參數(shù)是value(session id),之后返回response對(duì)象。當(dāng)請(qǐng)求是GET時(shí)候,首先就會(huì)使用request.cookies.get("sid")去獲取cookie中的session id,如果獲取到并且還在過期時(shí)間內(nèi),則向html傳入username表明當(dāng)前已經(jīng)登錄的用戶。
最后html的內(nèi)容如下:
Title {% if username %}Welcome {{ username }}
{% else %} {% endif %}
效果展示:
未登錄時(shí):
登錄后:
此時(shí)數(shù)據(jù)庫中的session信息:
瀏覽器中的cookie內(nèi)容:
過期之后瀏覽器仍然攜帶這個(gè)cookie,但刷新網(wǎng)頁又變成未登錄的狀態(tài)了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41394.html
摘要:通過配置規(guī)則和單位使用或來解決。其他關(guān)于我個(gè)人的一系列學(xué)習(xí)介紹及總結(jié)有興趣可以參閱自學(xué)筆記一安裝使用篇自學(xué)筆記二插件篇自學(xué)筆記二番外篇一自學(xué)筆記二番外篇二 利用PostCSS解決移動(dòng)端REM適配問題 上一期有提到結(jié)合postcss-px2rem插件來處理移動(dòng)端適配的方案,以及相關(guān)的避坑方法,之后總覺得這個(gè)解決方案問題太多,也就誕生了另一套方案運(yùn)用postcss-pxtorem插件來進(jìn)行...
摘要:之前寫過一系列的文章,也承諾過會(huì)盡快有的介紹。所以這次還是給大家分享一個(gè)使用解決問題的案例,希望對(duì)大家在使用的時(shí)候有一點(diǎn)點(diǎn)啟發(fā)。上述這一套復(fù)雜的業(yè)務(wù)邏輯如果使用傳統(tǒng)編碼方式將是極其復(fù)雜的。 之前寫過一系列RxJava1的文章,也承諾過會(huì)盡快有RxJava2的介紹。無奈實(shí)際項(xiàng)目中還未真正的使用RxJava2,不敢妄動(dòng)筆墨。所以這次還是給大家分享一個(gè)使用RxJava1解決問題的案例,希望對(duì)...
摘要:番外關(guān)于搜狐面試結(jié)果早上十點(diǎn)半去的,一面之后緊接著又是一面。手寫模擬的雙向數(shù)據(jù)綁定手寫有哪些屬性總結(jié)今天的面試的考察基本上都是,難度一般。今天月份剛剛畢業(yè),經(jīng)過這次搜狐面試,已經(jīng)成功拿到搜狐,現(xiàn)在已經(jīng)成功入職。 番外:關(guān)于搜狐面試 結(jié)果 早上十點(diǎn)半去的,一面之后緊接著又是一面。感覺還好,應(yīng)該還能繼續(xù)! 問題 一面: 1.數(shù)組去重,并計(jì)算時(shí)間復(fù)雜度。找出最優(yōu)解決方案。(手寫代碼)2.定義...
閱讀 693·2021-11-24 09:39
閱讀 2364·2021-11-22 13:54
閱讀 2231·2021-09-23 11:46
閱讀 3275·2019-08-30 15:55
閱讀 2705·2019-08-30 15:54
閱讀 2437·2019-08-30 14:18
閱讀 1567·2019-08-29 14:15
閱讀 2759·2019-08-29 13:49