Cookie-Session

Cookie

cookie就是保存在瀏覽器本地的一組組鍵值對html

HTTP協議是無狀態的,每次請求都是獨立的,不受前面的請求響應狀況直接影響,也不會影響後面的請求響應,對服務器來書,每次的請求都是全新的數據庫

特性:django

1.服務器讓瀏覽器進行設置的瀏覽器

2.保存在瀏覽器本地安全

3.瀏覽器下次訪問時自動攜帶響應的cookie服務器

做用:cookie

1.登陸校驗session

2.保存用戶的瀏覽習慣ide

3.簡單的投票函數

Django操做

# 設置
ret = redirect('/home/')
ret.set_cookie('is_login', '1',max_age=5)   # 普通的cookie '鍵','值',超時時間
ret.set_signed_cookie('is_login', '1', max_age=5,'day62')  # 加密的cookie  第四個參數加鹽

# 獲取
request.COOKIES['']   
request.COOKIES.get('')
request.get_signed_cookie('',salt='',default='')

# 刪除
ret = redirect('/login/')
ret.delete_cookie('')

 

登陸校驗

from django.shortcuts import render,redirect,HttpResponse
from django.views import View

# 裝飾器
def login_required(func):
    def inner(request,*args,**kwargs):
        is_login = request.COOKIES.get('is_login')    # 經過字典的鍵取值
        if is_login == '1':
            ret = func(request,*args,**kwargs)
        else:
            return_url = request.path_info
            ret = redirect('/login/?return_url={}'.format(return_url))    # 將當前訪問的地址拼接到login地址後,登陸成功後再跳轉回來
        return ret
    return inner


def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == '123':
            return_url = request.GET.get('return_url')
            if return_url:
                ret = redirect(return_url)
            else:
                ret = redirect('/home/')
            ret.set_cookie('is_login','1')
            # ret.set_signed_cookie('is_login','1','sss')    # 加密
            return ret
        else:
            return render(request,'login.html', {'err_msg':'用戶名或密碼錯誤'})
    return render(request,'login.html')


@login_required
def home(request):
    return HttpResponse('<h1>home</h1>')


@login_required
def index(request):
    return HttpResponse('<h1>index</h1>')


def logout(request):
    ret = redirect('/login/')
    ret.delete_cookie('is_login')   # 經過字典的鍵刪除
    return ret
示例

 

Session

保存在服務器上的一組組鍵值對,必須依賴於cookie

cookie保存在瀏覽器本地,不安全,可能被攔截或竊取

cookie自己最大支持4096字節,大小有限制

當瀏覽器首次訪問服務器時,服務器會在本身的數據庫文件中記錄一組鍵值對,鍵是隨機生成的,值是瀏覽器所提交的數據,好比帳號密碼等,將鍵返回給瀏覽器的cookies

保存,這樣用戶再訪問時,經過cookies所攜帶的惟一id進行驗證

django操做

# 獲取、設置、刪除Session中數據(經過字典的形式進行操做)
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123)      # 存在則不設置
del request.session['k1']

# 全部 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()

# 會話session的key
request.session.session_key

# 將全部Session失效日期小於當前日期的數據刪除
request.session.clear_expired()    # 默認爲兩週

# 檢查會話session的key在數據庫中是否存在
request.session.exists("session_key")

# 刪除當前會話的全部Session數據
request.session.delete()
  
# 刪除當前的會話數據並刪除會話的Cookie。
request.session.flush() 
    這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問
    例如,django.contrib.auth.logout() 函數中就會調用它。

# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
    * 若是value是個整數,session會在些秒數後失效。
    * 若是value是個datatime或timedelta,session就會在這個時間後失效。
    * 若是value是0,用戶關閉瀏覽器session就會失效。
    * 若是value是None,session會依賴全局session失效策略。

 

流程解析

 

 

登陸校驗

# 裝飾器
def login_required(func):
    def inner(request, *args, **kwargs):
         # 獲取session的值
        is_login = request.session.get('is_login')
                if is_login == '1':
            ret = func(request, *args, **kwargs)
        else:
            # 獲取要訪問的地址  拼接到login地址後
            return_url = request.path_info
            ret = redirect('/login/?return_url={}'.format(return_url))
        return ret
    return inner

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'alex' and pwd == '123':
            return_url = request.GET.get('return_url')
            if return_url:
                ret = redirect(return_url)
            else:
                ret = redirect('/home/')
            # 設置session
            request.session['is_login'] = '1'
            return ret
        else:
            return render(request,'login.html', {'err_msg':'用戶名或密碼錯誤'})
    return render(request,'login.html')


@login_required
def home(request):
    return HttpResponse('<h1>home</h1>')


@login_required
def index(request):
    return HttpResponse('<h1>index</h1>')


def logout(request):
    request.session.flush()         # 刪除當前的會話數據並刪除會話的Cookie
    return redirect('/login/')
示例
相關文章
相關標籤/搜索