Django之cookie+session

前言

HTTP協議 是短鏈接、且狀態的,因此在客戶端向服務端發起請求後,服務端在響應頭 加入cokie響應給瀏覽器,以此記錄客戶端狀態;
html

cook是來自服務端,保存在瀏覽器的鍵值對,主要應用於用戶登陸;python

cookie如此重要!!那麼如何在Django應用cookie呢?cookie又有什麼缺陷呢?mysql

1、Django應用cookie

參數介紹

一、max_age=1 :cookie生效的時間,單位是秒redis

二、expires:具體過時日期  sql

三、path='/':指定那個url能夠訪問到cookie;‘/’是全部; path='/'數據庫

四、 domain=None(None表明當前域名):指定那個域名以及它下面的二級域名(子域名)能夠訪問這個cookiedjango

五、secure=False:https安全相關json

 

六、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

一、普通

request.COOKIES.get(‘k’)

二、加鹽

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} )
View Code
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
Django不一樣響應方式設置cokie
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')
redirect方法設置cokie

 

2、cookie+session

一、cookie引入session:

cookie看似解決了HTTP(短鏈接、無狀態)的會話保持問題,但把所有用戶數據保存在客戶端,存在安全隱患,

因而cookie+session出現了!咱們能夠 把關於用戶的數據保存在服務端,在客戶端cookie里加一個sessionID(隨機字符串),

基於以上緣由:cook+session組合就此做古了單單使用cookie作會話保持的方式;

二、cookie+session的工做流程:

(1)、當用戶來訪問服務端時,服務端生成一個隨機字符串;

(2)、當用戶登陸成功後 把 {sessionID :隨機字符串} 組織成鍵值對 加到 cookie裏發送給用戶;

(3)、服務器以發送給客戶端 cookie中的隨機字符串作鍵,用戶信息作值,保存用戶信息;

 

三、保存在服務端session數據格式

{

 隨機字符串                                        用戶信息

傻狍子的隨機字符串:        {id:1,nam:"alex",account:1000000000 },

二狗子的隨機字符串:        {id:1,nam:"eric",account:10}

 

 

 

 

 注意:request.session['name']=‘alex’,request.session默認隱含了經過sessionID找到用戶信息那一步;

因此如今設置的是用戶信息的鍵(name)和用戶信息的值(alex),刪除也是如此!

四、最終得出結論了!!!

 

session的應用 要依賴於cookie:(session就是 cookie的變種)

(1)每次用戶第一次訪問服務端, 把用戶的惟一字符串 session_id加到cookie裏面,發送給客戶端;

 

(2)服務器端保存 隨機字符串(sessionID:{用戶信息})服務端

 

 

(3)下次來經過 cookie中的sessionID(鍵)獲取用戶信息值(值)

session做用:

會話保持,記住用戶的登陸狀態(WEB網站,分佈式架構)

做用(和cookie的區別)

避免了敏感信息保存在客戶端,防止客戶端修改cookie信息!

 

五、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:
            #一、生成隨機字符串(sessionID)
            #二、經過cookie發送給客戶端
            #三、服務端保存{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):
    #一、獲取客戶端的 sessionID
    #二、在服務端查找是否存在 這個sessionID
    #三、在服務端查看對應的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數據
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配置文件

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'   # 引擎

 

 

六、session注意事項

(1)、每一個用戶的保存在 服務端的sessionID保存在數據庫裏的 sessionID隔離不同的,不會形成用戶間的信息混淆!(淫王一問,我答錯了!)

(2)、若是A用戶和B用戶在同一個瀏覽器登陸,會!由於保存在瀏覽器的sessionID前後覆蓋了!!

(3)、若是用戶的cookie泄露了,別拿着你的cookie也是能夠 訪問服務端的,因此cookie必定要保存好。

 

 

博客連接

二龍湖浩哥:http://www.cnblogs.com/yuanchenqi/articles/7439088.html#3770465

相關文章
相關標籤/搜索