因爲HTTP協議是無狀態的,沒法記錄,也就是說每次訪問都會把訪問者當成一個新的對象,那瀏覽器來講,若是瀏覽器關閉cookie,全部須要登陸的功能都不能用。css
瀏覽器關閉方式:html
打開瀏覽器設置》高級設置》》網站設置》cookie關閉前端
查看方式:python
打開瀏覽器》F12》選擇Application》jquery
cookie是保存在客戶端瀏覽器上的鍵值對django
是服務端設置在客戶啊短瀏覽器上的鍵值對也就意味着瀏覽器實際上是能夠拒絕服務端命令的,默認狀況下瀏覽器都是直接讓服務器設置鍵值對bootstrap
Django三板斧:後端
return HTTPResponse() return render() return redirect() 變形: obj1 = HTTPResponse() return obj1 obj2 = render() return obj2 obj3 = redirect() return obj3
obj.set_cookie()瀏覽器
rep = HttpResponse(...) rep = render (request, ...) rep.set_ cookie(key,value,...) rep.set_ signed cookie (key,value,3a1t='加密鹽',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獲取 (不是絕對,底層抓包能夠獲取到也能夠被覆蓋)緩存
request.COOKIES.get()
request.COOKIES['key'] request.get_signed_cookie{key,default=RAISE_ERROR, salt='', max_age=None}
參數:
刪除
obj.delete_cookie
def logout(request): rep = redirect("/login/") rep.delete_cookie("/user/") # 刪除用戶瀏覽器上以前設置的usercookie值 return rep
session是保存在服務器上的鍵值對
django session默認的過時時間是14天
session
session是保存在服務器上的鍵值對
django session默認的過時時間是14天
操做session
設置session
request.session['key'] = value # 僅僅只會在內存產生一個緩存
"""
1.django內部自動生成了隨機的字符串
2.在django_session表中存入數據
session_key session_data date
隨機字符串1 數據1 ...
隨機字符串2 數據2 ...
隨機字符串3 數據3 ...
3.將產生的隨機字符串發送給瀏覽器 讓瀏覽器保存到cookie中
sessionid:隨機字符串
"""
獲取session
request.session.get('key')
"""
1.瀏覽器發送cookie到django後端以後 django會自動獲取到cookie值
2.拿着隨機字符串去django_session表中比對 是否有對應的數據
3.若是比對上了 就講隨機字符串所對應的數據 取出賦值給request.session
若是對不上 那麼request.session就是個空
"""
django session表是針對瀏覽器的 不一樣的瀏覽器來 纔會有不一樣的記錄
刪除session
request.session.delete() # 只刪除服務端的session
request.session.flush() # 瀏覽器和服務端所有刪除
session也能夠設置超時時間
request.session.set_expiry(value多種配置)
總結:總結而言: Cookie彌補了HTTP無狀態的不足,讓服務器知道來的人是」誰」;可是Cookiel以文本的形式保存在本地,自身安全性較差;因此咱們就經過Cookie識別不一樣的用戶,對應的在Session裏保存私密的信息以及超過4096字節的文本。另外,上述所說的Cookie和Session實際上是共通性的東西, 不限於語言和框架。
代碼實現以上功能:
urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^home/', views.home), url(r'^index/', views.index), url(r'^logout/', views.logout), url(r'^set_session/', views.set_session), url(r'^get_session/', views.get_session), url(r'^delete_session/', views.delete_session), ]
settings.py
註釋'django.middleware.csrf.CsrfViewMiddleware', 配置: STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ]
views.py
from django.shortcuts import render, HttpResponse, redirect # Create your views here. def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'zhang' and password == '123': old_path = request.GET.get('next') if old_path: # 保存用戶登陸狀態 obj = redirect(old_path) else: obj = redirect('/home/') obj.set_cookie('name', 'zhang') # 讓客戶端瀏覽器 記錄一個鍵值對 return obj return render(request, 'login.html') from functools import wraps def login_auth(func): @wraps(func) def inner(request, *args, **kwargs): if request.COOKIES.get('name'): res = func(request, *args, **kwargs) return res else: target_url = request.path_info return request('/login/?next=%s'%target_url) return inner @login_auth def home(request): return HttpResponse('請先登陸') @login_auth def index(request): return HttpResponse('index也須要先登陸') @login_auth def logout(request): obj = redirect('/login/') obj.delete_cookie('name') return obj def set_session(request): request.session['username'] = 'li' request.session.set_expiry(value=0) request.session['password'] = '123' return HttpResponse("設置session") def get_session(request): print(request.session.get('username')) print(request.session.get('password')) return HttpResponse('獲取session') def delete_session(request): request.session.flush() return HttpResponse("刪除session")
tests.py
from django.test import TestCase # Create your tests here. from functools import wraps def login_auth(func): @wraps(func) def inner(*args,**kwargs): """我是inner函數""" res = func(*args,**kwargs) return res return inner @login_auth # login(變量名) = login_auth(真正的login函數內存地址) def login(): """ 我是login函數 :return: """ ... print(login) print(help(login))
前端文件login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> </head> <body> <form action="" method="post"> <p>username:<input type="text", name="username"></p> <p>password:<input type="text", name="password"></p> <input type="submit"> </form> </body> </html>