前言
HTTP協議 是短連接、且狀態的,所以在客戶端向服務端發起請求后,服務端在響應頭 加入cokie響應給瀏覽器,以此記錄客戶端狀態;
cook是來自服務端,保存在瀏覽器的鍵值對,主要應用於用戶登錄;
cookie如此重要!!那么如何在Django應用cookie呢?cookie又有什么缺陷呢?
一、Django應用cookie
參數介紹
1、max_age=1 :cookie生效的時間,單位是秒
2、expires:具體過期日期
3、path='/':指定那個url可以訪問到cookie;‘/’是所有; path='/'
4、 domain=None(None代表當前域名):指定那個域名以及它下面的二級域名(子域名)可以訪問這個cookie
5、secure=False:https安全相關
6、httponly=False:限制只能通過http傳輸,JS無法在傳輸中獲取和修改
設置cookie
1.普通
obj.set_cookie("tile","zhanggen",expires=value,path='/' )
2.加鹽
普通cookie是明文傳輸的,可以直接在客戶端直接打開,所以需要加鹽,解鹽之后才能查看
obj.set_signed_cookie('k','v',salt="zhangge")
獲取cookie
1、普通
request.COOKIES.get(‘k’)
2、加鹽
cookies=request.get_signed_cookie('k',salt='zhanggen')
最后給每個視圖函數裝飾cookie認證功能

from until import mysqlhelper from django.shortcuts import HttpResponse,render,redirect import json import datetime from datetime import timedelta def cookie_auth(func): def weaper(request,*args,**kwargs): cookies = request.get_signed_cookie('k', salt='zhanggen') if cookies == 'v': return func(request) else: return HttpResponse('OK') return weaper now = datetime.datetime.utcnow() delta = timedelta(seconds=10) def login(request): if request.method=='GET': return render(request,'login.html') else: name = request.POST.get('N') pwd=request.POST.get('P') if name=="alex" and pwd=="123": obj=redirect("/modal") # obj.set_cookie("tile","zhanggen",max_age=1,) value=now+delta obj.set_cookie("tile","zhanggen",expires=value,path='/',domain=None,secure=False,httponly=False) obj.set_signed_cookie('k','v',salt="zhanggen",) return obj else: return render(request,'login.html') def test(request): return render(request,'layout.html') @cookie_auth def modal(request): sql=''' SELECT teacher.id as tid,teacher.`name`as tname,class.title FROM day64.teacher LEFT JOIN teacher_class ON day64.teacher.id=day64.teacher_class.tid LEFT JOIN day64.class ON day64.teacher_class.cid=day64.class.id; ''' teacher_list= mysqlhelper.get_list(sql,[]) res={} for row in teacher_list: tid=row["tid"] if tid in res: res[tid]["titles"].append(row["title"]) else: res[tid]={'tid':row["tid"],'tname':row["tname"],'titles':[row["title"],]} class_list=mysqlhelper.get_list("SELECT id ,title FROM day64.class" ,[]) return render(request,'modal.html',{"list":res.values(),"class_list":class_list} )

1、cookies 1、什么是cookies cookies是一種數據存儲技術 將一段文本保存在客戶端(瀏覽器)的一種技術。並可以長時間的保存 2、cookies的使用場合 1、保存登錄信息 2、保存用戶的搜索關鍵詞 3、django 中使用 cookies 1、設置cookies(保存數據到客戶端) 1、不使用模板 resp = HttpResponse("給客戶端的一句話") resp.set_cookie(key,value,expires) return resp key : cookie的名稱 value : 保存的cookie的值 expires : 保存的時間,以 s 為單位 ex: resp.set_cookie('uname','zsf',60*60*24*365) 2、使用模板 resp = render(request,'xxx.html',locals()) resp.set_cookie(key,value,expires) return resp 3、重定向 resp = HttpResponseRedirect('/login/') resp.set_cookie(key,value,expires) return resp 2、獲取cookies(從客戶端獲取數據) request.COOKIES

from django.shortcuts import render,HttpResponse,redirect,HttpResponseRedirect from tools.resis_handler import connect_obj def login(request): resp = redirect('/list_display/') resp.set_cookie('K','zhanggen') return resp def display(request): print(request.COOKIES['K']) return HttpResponse('OK')
二、cookie+session
1、cookie引入session:
cookie看似解決了HTTP(短連接、無狀態)的會話保持問題,但把全部用戶數據保存在客戶端,存在安全隱患,
於是cookie+session出現了!我們可以 把關於用戶的數據保存在服務端,在客戶端cookie里加一個sessionID(隨機字符串),
基於以上原因:cook+session組合就此作古了單單使用cookie做會話保持的方式;
2、cookie+session的工作流程:
(1)、當用戶來訪問服務端時,服務端生成一個隨機字符串;
(2)、當用戶登錄成功后 把 {sessionID :隨機字符串} 組織成鍵值對 加到 cookie里發送給用戶;
(3)、服務器以發送給客戶端 cookie中的隨機字符串做鍵,用戶信息做值,保存用戶信息;
3、保存在服務端session數據格式
{
隨機字符串 用戶信息
傻狍子的隨機字符串: {id:1,nam:"alex",account:1000000000 },
二狗子的隨機字符串: {id:1,nam:"eric",account:10}
注意:request.session['name']=‘alex’,request.session默認隱含了通過sessionID找到用戶信息那一步;
所以現在設置的是用戶信息的鍵(name)和用戶信息的值(alex),刪除也是如此!
4、最終得出結論了!!!
session的應用 要依賴於cookie:(session就是 cookie的變種)
(1)每次用戶第一次訪問服務端, 把用戶的唯一字符串 session_id加到cookie里面,發送給客戶端;
(2)服務器端保存 隨機字符串(sessionID:{用戶信息})服務端
(3)下次來通過 cookie中的sessionID(鍵)獲取用戶信息值(值)
session作用:
會話保持,記住用戶的登錄狀態(WEB網站,分布式架構)
作用(和cookie的區別)
避免了敏感信息保存在客戶端,防止客戶端修改cookie信息!
5、Django應用session
def login(request): if request.method=='GET': return render(request,'login.html') else: name=request.POST.get('user') pwd=request.POST.get('pwd') # obj=models.Girl.objects.filter(username=name,passwprd=pwd).first() obj = models.Boy.objects.filter(username=name, passwprd=pwd).first() if obj: #1、生成隨機字符串(sessionID) #2、通過cookie發送給客戶端 #3、服務端保存{zhanggen隨機字符串:{'name':'zhanggen'.'email':'zhanggen@le.com'}} request.session['name']=obj.username #在Django 中一句話搞定 request.session['email'] = 'zhanggen@le.com' return redirect('/index') else: return render(request,'login.html',{'msg':"用戶名/密碼錯誤"}) def index(request): #1、獲取客戶端的 sessionID #2、在服務端查找是否存在 這個sessionID #3、在服務端查看對應的key sessionID鍵的值中是否有name(有值就是登錄過了!!) v=request.session.get('name') print(v) if v: return render(request,'index.html',{'msg':v}) else:return redirect('/login/')
使用參數:
def index(request): # 獲取、設置、刪除Session中數據 request.session['k1'] request.session.get('k1',None) #這樣取值的不報錯,沒有拿None request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在則不設置 del request.session['k1'] # 所有 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用戶session的隨機字符串 request.session.session_key
request.session.clear_expired()
#sessionID在客戶端,過期后自動失效;
但session信息存儲在數據庫里,sessionID過期后怎么刪除呢?
無法動態刪過期的session,可執行這個方法!(數據庫中不僅存儲了session 還有該session的過期時間,這個方法就是where數據庫里時間過期的session刪除掉)
request.session.exists("session_key")# 檢查 用戶session的隨機字符串 在數據庫中是否
# 刪除當前用戶的所有Session數據
request.session.delete("session_key")
request.session.set_expiry(value) 設置session過期時間
* 如果value是個整數,session會在些秒數后失效。 *
如果value是個datatime或timedelta,session就會在這個時間后失效。 *
如果value是0,用戶關閉瀏覽器session就會失效。 *
如果value是None,session會依賴全局session失效策略。
session配置文件
#session配置文件 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = 文件路徑 # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T session不僅可以保存在數據庫里,
- 數據庫(默認)
- 緩存(memchache、redis)
- 文件
- 緩存+數據庫
- 加密cookie
SESSION_COOKIE_NAME="zhanggen" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串 SESSION_COOKIE_PATH="/" # Session的cookie保存的路徑 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸 SESSION_COOKIE_AGE = 600000 # Session的cookie失效日期(2周) 默認1209600秒 SESSION_EXPIRE_AT_BROWSER_CLOSE =True # 是否關閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST = True
#如果你設置了session的過期時間 30分鍾后,這個參數是False30分鍾過后,session准時失效
#如果設置 True,在30分鍾期間有請求服務端,就不會過期!(為什么逛一晚上淘寶,也不會登出,但是不瀏覽器不刷新了就會自動登出)
session保存位置配置
緩存 redis memcache SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 瀏覽器cook(相當於沒有用session,又把敏感信息保存到客戶端了) SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
6、session注意事項
(1)、每個用戶的保存在 服務端的sessionID保存在數據庫里的 sessionID隔離不一樣的,不會造成用戶間的信息混淆!(淫王一問,我答錯了!)
(2)、如果A用戶和B用戶在同一個瀏覽器登錄,會!因為保存在瀏覽器的sessionID先后覆蓋了!!
(3)、如果用戶的cookie泄露了,別拿着你的cookie也是可以 訪問服務端的,所以cookie一定要保存好。
博客鏈接
二龍湖浩哥:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465