django13:Session與Cookie操作

Session與Cookie

cookie

服務端保存在客戶端瀏覽器上的信息都可以教cookie

表現形式一般是k:v鍵值對(可以多個)

?

優化:

隨機字符串1:用戶1相關信息

隨機字符串2:用戶2相關信息

?

session

數據是保存在服務端

表現形式一般是k:v鍵值對

session是基于cookie工作。(大部分保存用戶狀態的操作都需要cookie)

?

token

session雖然數據保存在服務端,但是禁不住數據量大。

服務端不再保存數據

????? 登陸成功后,將一段信息進行加密處理(加密算法是自己開發)

????? 將加密后的結果拼在信息后面,整體返回給瀏覽器保存

???? 瀏覽器下次訪問帶著該數據信息,服務端自動切去前面一段信息再次使用自己加密算法

??? 跟瀏覽器尾部的密文進行對比

?

jwt認證

三段信息,后續補充。。。。

?

Cookie操作

瀏覽器禁用cookie,網站保存賬戶功能失效。

獲取Cookie

request.COOKIES當成一個字典

request.COOKIES['key']  或者  request.COOKIES.get('username')    username是key
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

參數:

  • default: 默認值
  • salt: 加密鹽
  • max_age: 后臺控制過期時間

設置Cookie

一定要用HttpResponse類直接或者間接產生的對象

obj = HttpResponse(...)
obj = render(request, ...)obj.set_cookie(key,value,...)
obj.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)

參數:

  • key, 鍵
  • value='', 值
  • max_age=None, 超時時間
  • expires=None, 超時時間(IE requires expires, so set it if hasn't been already.)
  • path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
  • domain=None, Cookie生效的域名
  • secure=False, https傳輸
  • httponly=False 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋

?

刪除Cookie

obj = HttpResponse(...)
obj = render(request, ...)
obj.delete_cookie("user")  # 刪除用戶瀏覽器上之前設置的usercookie值

Cookie版登陸校驗

def check_login(func):@wraps(func)def inner(request, *args, **kwargs):next_url = request.get_full_path()if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":# 已經登錄的用戶...return func(request, *args, **kwargs)else:# 沒有登錄的用戶,跳轉剛到登錄頁面return redirect("/login/?next={}".format(next_url))return innerdef login(request):if request.method == "POST":username = request.POST.get("username")passwd = request.POST.get("password")if username == "xxx" and passwd == "dashabi":next_url = request.GET.get("next")if next_url and next_url != "/logout/":response = redirect(next_url)else:response = redirect("/class_list/")response.set_signed_cookie("login", "yes", salt="SSS")return responsereturn render(request, "login.html")@check_login
def home(request):return HttpResponse("home頁面,只有登陸了才能查看~")

?

session操作

note:

1. django 默認存放django_session。需要遷移命令生成表格,才能存放session,也可以保存到其他地方。

2. django中默認的session超時時間為14天

request.session['key'] = value		1.django內部會自動生成一個隨機字符串2.去django_session表中存儲數據 鍵就是隨機字符串 值是要保存的數據(中間件干的)3.將生成好的隨機字符串返回給客戶端瀏覽器   瀏覽器保存鍵值對sessionid  隨機字符串		request.session.get('key')1.django會自動取瀏覽器的cookie查找sessionid鍵值對 獲取隨機字符串2.拿著該隨機字符串取django_session表中比對數據3.如果比對上了 就將隨機字符串對應的數據獲取出來并封裝到request.session供用戶調用

?

1. django session表中的數據條數取決于瀏覽器

??? 同一臺計算機同一個瀏覽器指揮有一條

?

設置session與cookie的超時時間

?

request.session.set_expiry(value)* 整數,session會在些秒數后失效。* datatime或timedelta,session就會在這個時間后失效。* 0,用戶關閉瀏覽器session就會失效。* 不寫(none),session會依賴全局session失效策略。

?

刪除session

request.session.flush() #瀏覽器和服務端都清空,推薦使用。

?

Session登陸驗證

from functools import wrapsdef check_login(func):@wraps(func)def inner(request, *args, **kwargs):next_url = request.get_full_path()if request.session.get("user"):return func(request, *args, **kwargs)else:return redirect("/login/?next={}".format(next_url))return innerdef login(request):if request.method == "POST":user = request.POST.get("user")pwd = request.POST.get("pwd")if user == "alex" and pwd == "alex1234":# 設置sessionrequest.session["user"] = user# 獲取跳到登陸頁面之前的URLnext_url = request.GET.get("next")# 如果有,就跳轉回登陸之前的URLif next_url:return redirect(next_url)# 否則默認跳轉到index頁面else:return redirect("/index/")return render(request, "login.html")@check_login
def logout(request):# 刪除所有當前請求相關的sessionrequest.session.delete()return redirect("/login/")@check_login
def index(request):current_user = request.session.get("user", None)return render(request, "index.html", {"user": current_user})

補充:

有時一些數據可以存入session,django_session表中。

eg:驗證碼

?

?

參考:https://www.cnblogs.com/guyouyin123/p/12297103.html

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280577.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280577.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280577.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從Windows XP升級? 這是您需要了解的Windows 7

With Windows XP reaching the end of its long support life, many businesses and individuals are avoiding Windows 8 and upgrading to Windows 7 instead. If you’re a latecomer to Windows 7, here are the basics you need to know. 隨著Windows XP使用壽命的延長&am…

Java迭代器原理

1迭代器模式 迭代器是一種設計模式,這種模式用于順序訪問集合對象的元素,不需要知道集合對象的底層表示。 一般實現方式如下:(來自) public interface Iterator {public boolean hasNext();public Object next(); } pu…

企業版Java EE正式易主 甲骨文再次放手

有人說甲骨文收購的東西大多沒有了好下場,這么說雖然有些片面,但是最近一個月Java EE和Solaris的境遇難免讓人產生類似的聯想。 繼筆者上次報道《甲骨文將放棄Java EE 開源基金會雙手歡迎》之后,最新消息顯示,原本在甲骨文手中的J…

js中各種位置

js中各種位置 js中有各種與位置相關的屬性,每次看到的時候都各種懵逼。索性一次總結一下。 clientHeight 內容可視區域的高度。包括padding不包括border、水平滾動條、margin。對于inline的元素這個屬性一直是0,單位px,只讀元素。offsetHeight offsetHei…

如何判斷您是否擁有32位或64位版本的Google Chrome瀏覽器

Google Chrome is extremely popular with our readers, but did you know that they also have a 64-bit version of the browser these days? Here’s how to tell which version you are running, and how to switch if you aren’t. 谷歌瀏覽器在我們的讀者中非常受歡迎&a…

django14:CBV加入裝飾器

加在方法上面 from django.utils.decorators import method_decoratorclass HomeView(View):def dispatch(self, request, *args, **kwargs):return super(HomeView, self).dispatch(request, *args, **kwargs)def get(self, request):return render(request, "home.html&…

Kubernetes 跨集群流量調度實戰 :訪問控制

背景眾所周知,Flomesh 的服務網格產品 osm-edge[1] 是基于 SMI(Service Mesh Interface,服務網格接口) 標準的實現。SMI 定義了流量標識、訪問控制、遙測和管理的規范。在 上一篇 中,我們體驗過了多集群服務&#xff0…

python下sqlite增刪查改方法(轉)

sqlite讀寫 #codingutf-8 import sqlite3 import os #創建數據庫和游標 if os.path.exists( test.db):connsqlite3.connect( test.db)curconn.cursor() else:connsqlite3.connect( test.db)curconn.cursor()#創建表 cur.execute(CREATE TABLE IF NOT EXISTS customer (ID VARCH…

Apache HTTP Server 與 Tomcat 的三種連接方式介紹

本文轉載自IBM developer 首先我們先介紹一下為什么要讓 Apache 與 Tomcat 之間進行連接。事實上 Tomcat 本身已經提供了 HTTP 服務,該服務默認的端口是 8080,裝好 tomcat 后通過 8080 端口可以直接使用 Tomcat 所運行的應用程序,你也可以將該…

印象筆記和有道云筆記程序員_記錄,存儲和共享筆記的最佳應用程序和云服務...

印象筆記和有道云筆記程序員Is your desk and computer covered with sticky notes? Do you have miscellaneous pieces of paper with bits of information buried in drawers, your laptop case, backpack, purse, etc.? Get rid of all the chaos and get organized with …

java B2B2C 仿淘寶電子商城系統-Spring Cloud Eureka參數配置項詳解

Eureka涉及到的參數配置項數量眾多,它的很多功能都是通過參數配置來實現的,了解這些參數的含義有助于我們更好的應用Eureka的各種功能,下面對Eureka的配置項做具體介紹,供大家參考。 需要JAVA Spring Cloud大型企業分布式微服務云…

django15:中間件

中間件 開發django項目是,涉及全局相關功能,都可以使用中間件實現。 1.請求時,需要經過中間件,才能到達真正的django后端。 2.響應走的時候,也要經過中間件,才能出去。 依次經過里面的中間件進出&#x…

互聯網算法和產品優化的幾個反直覺現象

本文不涉及任何具體的業務和形態,沒有公開任何數據和需要保護的技術。互聯網產品和算法的優化,是廣大程序員和產品經理的主要工作。但想準確衡量線上實驗效果,從來都不簡單。筆者將這些反直覺現象,總結成三個典型案例予以討論。然…

SD 胡策 Round 1 T3 彩尾巴猹的二進制數

發現一個區間[L,R]代表的2進制數是3的倍數,當且僅當從L開始的后綴二進制值 - 從R1開始的后綴二進制值 是 3 的倍數 (具體證明因為太簡單而被屏蔽)。 于是我們就可以在每個點維護從它開始的后綴二進制數的值,因為在%3同余系下只有3個數,所以我…

求解10的75次方問題

對于求一個數的高次方,最簡單的方法,恐怕就是循環一定的次數,累乘。但是這樣的效率太低。下面我提供一個高效的算法。來自左程云《程序員代碼面試指南》。 就拿10的75次方舉例: 1.75的二進制數形式是1001011。 2.10的75次方10的64…

又是新的一周

自己的決定還記得嗎轉載于:https://www.cnblogs.com/zhangxiangning/p/10300093.html

django16: csrf跨站請求偽造/CSRF相關裝飾器

CSRF 即跨站請求攻擊 跨站請求偽造csrf釣魚網站本質搭建一個跟正常網站一模一樣的頁面用戶在該頁面上完成轉賬功能轉賬的請求確實是朝著正常網站的服務端提交唯一不同的在于收款賬戶人不同給用戶書寫form表單 對方賬戶的input沒有name屬性你自己悄悄提前寫好了一個具有默認的…

dropbox_Google的新存儲定價與Microsoft,Apple和Dropbox相比如何

dropboxGoogle’s subscription storage service has a new name: Google One. Some prices are dropping and customers will also get customer support from an actual human for the first time. Google的訂閱存儲服務有一個新名稱:Google One。 一些價格正在下…

WPF效果第二百零六篇之快速黑白灰效果

一大早就看到群友討論怎么快速讓界面黑白灰效果,這不突然想起來N年前咱簡單通過ShaderEffects調節過飽和度、對比度、亮度;今天再次玩耍一下;來看看最終實現的效果:1、核心代碼:sampler2D implicitInput : register(s0); float factor : register(c0); float4 main(…

極大似然估計與貝葉斯定理

文章轉載自:https://blog.csdn.net/zengxiantao1994/article/details/72787849 極大似然估計-形象解釋看這篇文章:https://www.zhihu.com/question/24124998 貝葉斯定理-形象解釋看這篇文章:https://www.zhihu.com/question/19725590/answer/…