爲何要有cookie,由於http是無狀態的,每次請求都是獨立的,可是咱們還須要保持狀態,因此就有了cookiehtml
cookie就是保存在客戶端瀏覽器上的鍵值對,別人能夠利用他來作登錄前端
rep = redirect("/app1/index/") rep.set_signed_cookie("user_name",db_name,max_age=600) rep.set_signed_cookie("user_pwd", db_pwd, max_age=600)
這裏爲何要經過redirect去設置cookie嗎?是由於cookie是保存在客戶端的瀏覽器上的,經過redirect向客戶端返回數據,順便把cookie的數據發送給瀏覽器,讓瀏覽器能夠處理;python
那麼,是否只能經過redirect向客戶端發送cookie,以前是這樣認爲的,其實這是錯誤的,經過Httpresponse和render均可以向客戶端發送數據,他們也能夠攜帶cookie給客戶端瀏覽器jquery
獲取cookie數據庫
cookie_name = request.get_signed_cookie("user_name",None) cookie_pwd = request.get_signed_cookie("user_pwd",None)
能夠在服務端操做cookie,也能夠在前端頁面操做cookiedjango
今天寫代碼發現一個錯誤,能夠更好的體現cookie是放在客戶端瀏覽器上json
我開始是這樣寫的代碼後端
if db_name == input_name and db_pwd == input_pwd: rep = redirect("/app1/index") rep.set_signed_cookie("username",db_name,max_age=600) rep.set_signed_cookie("userpwd", db_pwd, max_age=600) error_dict = {"error": "用戶名或者密碼錯誤", "status": "success"} rep = HttpResponse(json.dumps(error_dict)) return rep
我用redirect的對象設置cookie,可是最後return的時候是return的Httpresponse,我這樣的寫,後面怎麼也獲取不到cookie,原來這裏僅僅是設置了cookie,可是沒有使用return返回,也就是沒有發給客戶端,後面我一直獲取cookie卻獲取不到,緣由就是cookie壓根就沒有發給客戶端,固然就獲取不到cookie了,後面我將代碼修改成下面的,就能夠獲取到了瀏覽器
if db_name == input_name and db_pwd == input_pwd: # rep = redirect("/app1/index") error_dict = {"error": "用戶名或者密碼錯誤", "status": "success"} rep = HttpResponse(json.dumps(error_dict)) rep.set_signed_cookie("username",db_name,max_age=600) rep.set_signed_cookie("userpwd", db_pwd, max_age=600) return rep
用Httpresponse的對象去設置cookie,而後也return返回Httpsponse的對象,最後在客戶端就能夠正常的獲取的cookie了服務器
設置cookie,在視圖函數中,redirect方法返回的對象中能夠設置cookie,使用set_cookie設置不加密的cookie,使用set_signed_cookie設置加密的cookie,其中的各類參數具體代碼中的描述
rep = redirect("/user_manager_app1/index/") rep.set_cookie("username",user_name,path="/test/") print("用戶名------------->", user_name) print("用戶名------------->", user_pwd) # rep.set_cookie("username", user_name, max_age=10, path="/") rep.set_cookie("username", user_name, path="/test/", domain="www.oldboy.com",secure=False,httponly=False) rep.set_signed_cookie() # 設置cookie,經過鍵值對設置cookie # max_age值的10的意思10秒鐘後自動消失,就是超時時間 # path的意思是我訪問哪一個url才能訪問到這個cookie,默認path="/",意思是訪問任何url均可以獲取到 # domain的意思是訪問哪一個域名才能訪問到這個cookie,且你只能設置本身的域名,你不能設置別人的domin的域名 # secure的若是爲false則不須要證書,意思就是用http訪問,可是若是設置爲true,則意思是須要證書,意思是經過https訪問 # httponly的意思只能經過http協議網絡傳輸才能用這個cookie,若是經過js是不能使用的這個cookie # 敏感信息不能放在cookie中,能夠放到數據庫中,可是這樣會頻繁操做數據庫,這樣就很差了,咱們有兩種方法解決 # 一、對cookie進行加密,使用rep.set_signed_cookie()進行設置加密後的cookie,這樣的話,咱們在取cookie的時候也須要 # 切換方法,使用request.get_signed_cookie()去獲取cookie # # 將不敏感的信息放在cookie中,用加密的方式,而後將敏感的信息放在數據庫中,作到敏感信息不外露,可是會加劇服務器的負擔
咱們通常須要對cookie加鹽,爲了防止被破解
if name == "cui" and pwd == "123": rep = redirect("/app1/home/") rep.set_signed_cookie("cookie_name",name,salt="gg") rep.set_signed_cookie("cookie_pwd", pwd,salt="pp") # rep.set_cookie() return rep
salt就是加鹽
一樣,若是咱們想取cookid,也須要加鹽才能取出來
def home(request): cookie_name = request.get_signed_cookie("cookie_name",None,salt="gg") cookie_pwd = request.get_signed_cookie("cookie_pwd",None,salt="pp") # cccc = request.COOKIES.get() print(cookie_pwd,cookie_name,"----------------") if cookie_name == "cui" and cookie_pwd == "123": return render(request,"home.html") else: return redirect("/app1/login/")
如何取出cookie,在視圖函數中的request使用request.COOKIES.get能夠獲取不加密的cookie,使用request.get_signed_cookie去獲取加密的cookie
def index(request): # 若是用已經登陸,獲取當前登陸的用戶名,不然返回到登陸頁面 u_name = request.COOKIES.get("username") # u_name = request.get_signed_cookie() if u_name: return render(request,"index.html",{"user_name":u_name}) else: return redirect("/user_manager_app1/login/")
在django中通常這樣使用cookies,咱們通常會把獲取cookies放在一個裝飾器函數中,而後每一個函數用這個裝飾器函數裝飾就能夠了
def outer(func): def innder(request): try: user_name = request.get_signed_cookie("username") user_pwd = request.get_signed_cookie("userpwd") if user_name == "admin" and user_pwd == "admin123.": rep = func(request) return rep except Exception as e: print(e) return redirect("/app1/login") return innder
被裝飾的函數
@outer def index(request): # user_name = request.COOKIES.get("username") user_name = request.get_signed_cookie("username") return render(request,"index.html",{"username":user_name})
咱們在urls中的信息
urlpatterns = [ # path('test1/', views.test1), # path('many_to_many_func/', views.many_to_many_func), path('test/', views.test), path('register/', views.register), path('login/', views.login), path('index/', views.index), ]
在路由匹配中,執行index函數,其實就是在執行innder函數,由於裝飾器函數的outer返回的值是innder函數的地址,裝飾器函數outer接受一個參數func,而這個func就是原來的index的地址,全部咱們最後實現一個在執行index函數以前,先去cookies中判斷是否有值,且值是否符合咱們要求的目的,其餘函數若是須要判斷cookies是否有值,也能夠調用這個裝飾器便可
在前端操做cookie最好導入一個jquery的一個插件,這個插件能夠更好的操做cookie,插件的名字是「jquery.cookie.js」
首先須要導入jquery,而後在導入jquery.cookie.js,才能是一共jqury的cookie的方法
<script src="/static/jquery-3.3.1.js"></script> <script src="/static/jquery.cookie.js"></script>
設置cookie的方法
$.cookie("name","age",{"path":"/"}); {# 在前端和後端設置cookie和斷後端的參數都是同樣的,cookie只保存在客戶端上#}
前端設置cookie和後端的參數徹底同樣的
獲取cookie
alert($.cookie("name"))
在前端若是操做加密和cookie,老師未講到,後面我在查下吧