摘要:字段為可以訪問此的域名。二級域名能讀取設(shè)置了為頂級域名或者自身的,不能讀取其他二級域名的。頂級域名只能獲取到設(shè)置為頂級域名的,其他設(shè)置為二級域名的無法獲取。若設(shè)置其值為一個時間,那么當(dāng)?shù)竭_(dá)此時間后,此失效。控制是否應(yīng)被設(shè)置安全標(biāo)志,默認(rèn)為。
session的用法
session在Flask中通常用做設(shè)置某些頁面的權(quán)限,比如某些頁面必須要登錄才可以看到,登錄的信息或標(biāo)志就放到session中.它的使用過程如下:
在整個flask工程的啟動文件中添加app.config["SECRET_KEY"] = "you never guess",SECRET_KEY是用來加密session的,本質(zhì)上是一個加密鹽.
再在使用的py文件中添加from functools import wraps ,封裝裝飾器
在使用的py文件中添加from flask import session
然后寫處理函數(shù)
再在邏輯代碼中寫已經(jīng)登錄的標(biāo)志或者是存儲其他關(guān)于請求的信息
最后在設(shè)置限制的視圖函數(shù)前添加限制函數(shù)的修飾器
一個簡單的例子# encoding: utf-8 from flask import Flask from flask import request, session, redirect from functools import wraps app = Flask(__name__) app.config["SECRET_KEY"] = "you never guess" # 使用 session 必須要配置這個,加密簽名. # 登錄、注冊認(rèn)證函數(shù) def authorize(fn): @wraps(fn) def wrapper(*args, **kwargs): # 這里就像過濾器,有了那個修飾器標(biāo)志的視圖函數(shù)都必須經(jīng)過這個函數(shù)才可以返回請求 user = session.get("logged_in", None) # 取得登錄標(biāo)志 if user: return fn(*args, **kwargs) # 登錄了就返回請求 else: return "need login!" # 否則就轉(zhuǎn)到注冊的頁面 return wrapper @app.route("/") @app.route("/home") def index(): session["global_name"] = "global_path" return session["global_name"] + "home.html" @app.route("/find") def find(): print(vars(session)) return session.get("global_name", "None") + "find.html" @app.route("/doc") @authorize # 這個修飾器表示,這個視圖頁面必須登錄才可以訪問 def blog(): print(session["username"]) return "blog.html" # 登錄用戶 @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "GET": return "login.html" if request.method == "POST": username = request.values.get("username") password = request.values.get("password") if username and password: session["logged_in"] = True # 登錄成功 session["username"] = username session["password"] = password return username + password else: return "need username and password" # 注銷用戶 @app.route("/signout", methods=["GET", "POST"]) @authorize def logout(): session["logged_in"] = False # 變成false 就意味著需要重新登錄了 return redirect("/home") if __name__ == "__main__": app.run()幾句curl測試
# 登錄接口與返回,可以看出response中set-cookie了 curl -X POST "http://127.0.0.1:5000/login" -d "username=test&password=123" HTTP/1.0 200 OK Set-Cookie: session=eyJsb2dnZWRfaW4iOnRydWUsInBhc3N3b3JkIjoiMTIzIiwidXNlcm5hbWUiOiJsZ2oifQ.DoNGjg.4c2Adke_tzqo5MW_BHs95FvY6i4; HttpOnly; Path=/ # 不帶cookie訪問需要登錄的接口 curl "http://127.0.0.1:5000/doc" need signin! # 帶上cookie后訪問通過 curl --cookie "session=eyJsb2dnZWRfaW4iOnRydWUsInBhc3N3b3JkIjoiMTIzIiwidXNlcm5hbWUiOiJsZ2oifQ.DoNGjg.4c2Adke_tzqo5MW_BHs95FvY6i4" "http://127.0.0.1:5000/doc" user/blog.html # 登出接口也是同上的. curl "http://127.0.0.1:5000/logout" need signin! curl --cookie "session=eyJsb2dnZWRfaW4iOnRydWUsInBhc3N3b3JkIjoiMTIzIiwidXNlcm5hbWUiOiJsZ2oifQ.DoNGjg.4c2Adke_tzqo5MW_BHs95FvY6i4" "http://127.0.0.1:5000/signout"總結(jié):Redirecting... Redirecting...
You should be redirected automatically to target URL: /home. If not click the link. # 使用session存儲一些其他信息也是依賴于cookie存在的 curl -v "http://127.0.0.1:5000" global_pathhome.html HTTP/1.0 200 OK Set-Cookie: session=eyJnbG9iYWxfbmFtZSI6eyIgYiI6IloyeHZZbUZzWDNCaGRHZz0ifX0.DoNPag.ooEMHsinZlKRQpLF_-S3axsH3jc; HttpOnly; Path=/ # 想要得到設(shè)置global_name,不帶cookie是得不到的 curl "http://127.0.0.1:5000/find" Nonefind.html # 帶cookie curl --cookie "session=eyJnbG9iYWxfbmFtZSI6eyIgYiI6IloyeHZZbUZzWDNCaGRHZz0ifX0.DoNPag.ooEMHsinZlKRQpLF_-S3axsH3jc" "http://127.0.0.1:5000/find" global_pathfind.html # 設(shè)置cookie curl -v "http://127.0.0.1:5000/set_cookie" < HTTP/1.0 200 OK < Set-Cookie: name=test; Expires=Wed, 19-Sep-2018 03:42:31 GMT; Max-Age=200; Path=/ < Set-Cookie: age=18; Path=/ set_cookie* Closing connection 0 # 獲取cookie curl --cookie "name=test;age=18" "http://127.0.0.1:5000/get_cookie" name is test,name is 18
平時使用瀏覽器訪問接口,很難注意到cookie和session的區(qū)別與聯(lián)系,使用curl就把區(qū)別暴露了出來.
上面的curl交互可以看出 session是會以set-cookie的方式設(shè)置到瀏覽器中,之后的訪問都會將cookie帶上請求其他接口,若使用curl而不帶上cookie就會導(dǎo)致錯誤,這也是為什么說session是依賴cookie存在的.
cookie存在的目的:
因?yàn)閔ttp協(xié)議屬于無狀態(tài)協(xié)議,它不跟蹤從一個客戶端到另一個客戶端的請求信息.也就是說即使第一次和服務(wù)器連接后并且登錄成功,第二次請求服務(wù)器依然不知道請求的是哪個用戶.
所以使用cookie來解決這個問題:第一次登錄成功后,服務(wù)器返回cookie給瀏覽器,然后瀏覽器保存在本地,當(dāng)用戶發(fā)送第二次請求時,就會自動的把上次請求存儲的cookie數(shù)據(jù)攜帶給服務(wù)器,服務(wù)器再根據(jù)cookie數(shù)據(jù)判斷是哪個用戶.
session和cookie的作用類似:
也是用來存儲用戶相關(guān)的信息,存儲在服務(wù)器端.把用戶的信息經(jīng)過加密后存儲在session中,然后產(chǎn)生一個唯一的session_id.
cookie和session的結(jié)合使用
一般有兩種存儲方式:
(1) 存儲在服務(wù)器端:通過cookie存儲一個session_id,然后具體的數(shù)據(jù)則是保存在session中.如果用戶已經(jīng)登錄,則服務(wù)器會在cookie中保存一個session_id,下次再請求時,會把該session_id攜帶上來,服務(wù)器根據(jù)session_id在session庫中獲取用戶的session數(shù)據(jù),就知道用戶到底是誰了.以及之前保存的一些狀態(tài)信息,這種專業(yè)術(shù)語叫做server side session. (2) 存儲在客戶端:將session數(shù)據(jù)加密,然后存儲在cookie中.這種專業(yè)術(shù)語叫做 client side session.flask框架采用的就是這種方式,但是可以替換成其他形式.flask的session機(jī)制
把用戶信息經(jīng)過加密后放入到session中,然后把session存放到cookie中.下次請求時,從瀏覽器發(fā)送過來的cookie中讀取到session,然后再從session中讀取數(shù)據(jù)并解密,獲取最終的用戶數(shù)據(jù).這樣可以節(jié)省服務(wù)器開銷.
cookie的刪除1) 可以通過在瀏覽器中設(shè)置來清除cookie. (2) 使用Response的set_cookie進(jìn)行清除 @app.route("/del_cookie") def del_cookie(): response=make_response("delete cookie") response.set_cookie("Name","",expires=0) return response (3)使用Response的 delete_cookie方法. @app.route("/del_cookie2") def del_cookie2(): response=make_response("delete cookie2") response.delete_cookie("Name") return responsecookie的其他屬性
觀察"Set-Cookie: name=test; Expires=Wed, 19-Sep-2018 03:42:31 GMT; Max-Age=200; Path=/" 可以看出其實(shí)cookie有很多屬性,如下:
在chrome控制臺中的resources選項(xiàng)卡中可以看到cookie的信息。 一個域名下面可能存在著很多個cookie對象。 name 字段為一個cookie的名稱。 value 字段為一個cookie的值。 domain 字段為可以訪問此cookie的域名。 非頂級域名,如二級域名或者三級域名,設(shè)置的cookie的domain只能為頂級域名或者二級域名或者三級域名本身,不能設(shè)置其他二級域名的cookie,否則cookie無法生成。 頂級域名只能設(shè)置domain為頂級域名,不能設(shè)置為二級域名或者三級域名,否則cookie無法生成。 二級域名能讀取設(shè)置了domain為頂級域名或者自身的cookie,不能讀取其他二級域名domain的cookie。所以要想cookie在多個二級域名中共享,需要設(shè)置domain為頂級域名,這樣就可以在所有二級域名里面或者到這個cookie的值了。 頂級域名只能獲取到domain設(shè)置為頂級域名的cookie,其他domain設(shè)置為二級域名的無法獲取。 path 字段為可以訪問此cookie的頁面路徑。 比如domain是abc.com,path是/test,那么只有/test路徑下的頁面可以讀取此cookie。 expires/Max-Age 字段為此cookie超時時間。若設(shè)置其值為一個時間,那么當(dāng)?shù)竭_(dá)此時間后,此cookie失效。不設(shè)置的話默認(rèn)值是Session,意思是cookie會和session一起失效。當(dāng)瀏覽器關(guān)閉(不是瀏覽器標(biāo)簽頁,而是整個瀏覽器) 后,此cookie失效。 Size 字段 此cookie大小。 http 字段 cookie的httponly屬性。若此屬性為true,則只有在http請求頭中會帶有此cookie的信息,而不能通過document.cookie來訪問此cookie。 secure 字段 設(shè)置是否只能通過https來傳遞此條cookie
下面是flask中cookie對應(yīng)屬性的配置項(xiàng)
SECRET_KEY 密鑰 SESSION_COOKIE_NAME 會話 cookie 的名稱 SESSION_COOKIE_DOMAIN 會話 cookie 的域。如果沒有設(shè)置的話, cookie 將會對 SERVER_NAME 所有的子域都有效。 SESSION_COOKIE_PATH 會話 cookie 的路徑。如果沒有設(shè)置或者沒有為 "/" 設(shè)置,cookie 將會對所有的 APPLICATION_ROOT 有效。 SESSION_COOKIE_HTTPONLY 控制 cookie 是否應(yīng)被設(shè)置 httponly 的標(biāo)志, 默認(rèn)為 True 。 SESSION_COOKIE_SECURE 控制 cookie 是否應(yīng)被設(shè)置安全標(biāo)志,默認(rèn)為 False。擴(kuò)展
既然session依賴cookie,要是瀏覽器禁用了cookie改怎么達(dá)到狀態(tài)保持的效果呢?
這個時候,就需要用到URL重寫了,既讓服務(wù)器收到的每個請求參數(shù)中都帶有sessioinId,也就是從原本的隱式(headers傳參)變?yōu)閡rl或body傳參。
當(dāng)我們清空瀏覽器的時候,session會消失嗎?
這個問題包含著一些陷阱。因?yàn)楹芏鄷r候當(dāng)我們清空瀏覽器以后,確實(shí)需要重新登錄系統(tǒng)才可以操作,所以很多人自然而然認(rèn)為清空瀏覽器緩存(包含cookie)以后session就會消失。
其實(shí)這種結(jié)論是錯誤的。要知道,session是存在于服務(wù)器的,你清除瀏覽器緩存,只是清除了cookie,跟session一點(diǎn)關(guān)系都沒有。那么為什么我們卻不能訪問網(wǎng)站,而需要重新登錄了呢?因?yàn)榍蹇樟藶g覽器緩存,這時候cookie數(shù)組中必定不會有JSESSIONID這個cookie,所以必須得新建一個session,用新的sessionId來給JSESSIONID這個cookie賦值。由于是新建的session,session中必定沒有userId這樣的屬性值,所以判斷結(jié)果自然為空,所以需要重新登錄。這次賦值以后,下一次再請求該網(wǎng)站的時候,由于cookie數(shù)組中已經(jīng)有了JSESSIONID這個cookie,并且能通過該JSESSIONID的值找到相應(yīng)的session,所以就不需要再重新登錄了。
http://www.pythondoc.com/flas...
https://blog.csdn.net/qq_3752...
https://www.cnblogs.com/keyi/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42466.html
摘要:說明我寫這篇文章的目的其實(shí)是想科普一下基礎(chǔ)的數(shù)據(jù)傳輸和交互流程,其實(shí)也就是寫協(xié)議相關(guān)的一些東西。同樣,相對于后端程序來說也無外乎就是一大堆有一定意義的字符串,而對于腳本來說,就是表示一個數(shù)據(jù)對象。 說明 我寫這篇文章的目的其實(shí)是想科普一下基礎(chǔ)的數(shù)據(jù)傳輸和交互流程,其實(shí)也就是寫http協(xié)議相關(guān)的一些東西。而寫這篇文章也主要是源于最近和長久以來很多人問的問題都是有關(guān)于這塊的(可能問題并不是...
摘要:在的配置文件中可以設(shè)置,比如這個項(xiàng)目中設(shè)置名稱為我們可以看到刷新頁面,查看,會發(fā)現(xiàn)一個名稱為的,名字就是我們自定義的。而這種加密方式是每次加密的結(jié)果都不同,所以表現(xiàn)為的值每次都發(fā)生了變化,而實(shí)際上并沒有改變。 在 Laravel 的配置文件 config/session.php 中可以設(shè)置 Session Cookie Name,比如這個項(xiàng)目中設(shè)置名稱為sns_session: /* ...
摘要:一緩存瀏覽器緩存分為強(qiáng)緩存和協(xié)商緩存。然后瀏覽器收到響應(yīng)后,會把這個以及響應(yīng)的資源一起緩存下來。語法保存數(shù)據(jù)到從獲取數(shù)據(jù)從刪除保存的數(shù)據(jù)從刪除所有保存的數(shù)據(jù)參考鏈接九種瀏覽器端緩存機(jī)制知多少瀏覽器緩存知識小結(jié)及應(yīng)用瀏覽器緩存機(jī)制剖析 這篇文章只是對我覺得常用的緩存方法的學(xué)習(xí)記錄。我是通過參考下面參考資料做的總結(jié),大家可以直接看參考鏈接里的文章,他們的記錄更全面且?guī)D。 一、http緩存...
閱讀 1630·2023-04-25 18:19
閱讀 2078·2021-10-26 09:48
閱讀 1079·2021-10-09 09:44
閱讀 1730·2021-09-09 11:35
閱讀 3027·2019-08-30 15:54
閱讀 2021·2019-08-30 11:26
閱讀 2285·2019-08-29 17:06
閱讀 884·2019-08-29 16:38