django學習之- Cookie

cookie:客戶端遊覽器上的一個文件,以鍵值對進行保存,相似字典{'k':'sfs'},與服務器端沒有關係,當遊覽器訪問服務器時候,服務器會
生成一個隨機字符串保存在cookie中返回給客戶端,這樣當客戶端遊覽器下次訪問服務器端時候,會帶着這個保存了服務器端的隨機字符串的
cookie訪問服務器,服務器端收到請求後,通過檢查此cookie已存在此隨機字符串,表示此客戶端爲已經過認證的狀態,能夠直接登陸。
舉例:
經過賬號登陸服務器後,服務器端對cookie進行username標識,等客戶端下一次訪問時候,服務器端先提取cookie的username,若是不爲空,表示爲已登陸賬號
def login(request)
    u = request.POST.get('name')
    # 對登陸賬號進行驗證,若是經過,執行下面
    res = redirect('/index')
    res.set_cookie('username',u)
    return res

在index的函數直接提取當前登陸的賬號是否匹配
def index(request)
    #提取遊覽器中的cookie,若是不爲空,表示爲已登陸賬號
    v = request.COOKIES.get('username')
    if not v:
        return redirect('/login')
    return render(request,'index.html',{'curr_name':v}
View Code
這時,頁面使用{{curr_name}}能夠直接獲取登陸賬號名稱

遊覽器查看cookie的方法:這裏的cookie能夠經過遊覽器的「審查元素」-> "network" -> "Cookies" 看到

request.COOKIES:包含用戶發來的全部數據,這個COOKIES就是一個字典,獲取方法有如下2種
獲取cookis,獲取用戶發來請求中的cookies
request.COOKIES['username111']
request.COOKIES.get('username111')

設置cookies,服務器端返回給客戶端,並寫入cookies
response = render(request,'index.html')
response = redirect('/index/')
# 設置cookie,關閉遊覽器自動失效
response.set_cookie('key','value')
return response
# 設置cookies超過10秒失效,寫法
response.set_cookie('key','value',max_age=10)
# 從登陸10秒後失效,寫法
current_time = datetime.datetime.utcnow()
current_data = current_time + datetime.timedelta(seconds=10)
response.set_cookie('key','value',expires=current_data)

rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽',...)
參數:
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獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)

cookie 將字符串進行salt加解密,寫法以下:
obj = HttpResponse('s')
obj.set_signed_cookie('username','jack',salt='adfadf') # 經過salt進行加密
request.get_signed_cookie('username',salt='adfadf') # 經過原來的salt進行解密

注意:獲取cookies寫法:request.COOKIES.get('名稱') 設置cookies寫法:response.set_cookie('key','value')

實例:userlist經過cookie實現頁面顯示數量
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>分頁</title>
    <style>
        .page {
            background:#9acfea;
            padding: 5px;
            margin:5px;
        }
        .active{
            background:red;
        }
    </style>
</head>
<body>
    <ul>
        {% for i in li %}
        {% include 'li.html' %}
        {% endfor %}
    </ul>
{#    {{ page_str|safe }}#}
    <div style="float: left;">
        <select id='ps' onchange="changePageSize(this);">
            <option value="10">10</option>
            <option value="50">50</option>
            <option value="100">100</option>
        </select>
    </div>
    <div style="float: left;">
        {{ page_str }}
    </div>
<script src="/static/jquery-1.12.4.min.js"></script>
<script src="/static/jquery-cookie/jquery.cookie.js"></script>
<script>
    /*select選項框修改成當前顯示數量*/
    $(function () {
        var v = $.cookie('per_page_count',{'path':"/ug/userlist"});
        $('#ps').val(v)
    });
    /*select選項框選擇後自動刷新頁面*/
    function changePageSize(ths) {
        var v = $(ths).val();
        $.cookie('per_page_count',v,{'path':"/ug/userlist"});
        location.reload();
    }
</script>
</body>
</html>
View Code

 實例:FBV實現一個賬號登陸後,保持10秒,並使用裝飾器檢查每一個URL都爲賬號登陸狀態html

def auth(func):
    ''' 裝飾器,檢查當前遊覽器cookies裏logname是否存在已登陸的賬號,若是存在,則繼續執行下面的函數,返回計劃進入的url'''
    def inner(request,*args,**kwargs):
        v = request.COOKIES.get('logname')
        if not v:
            return redirect('/')
        return func(request,*args,**kwargs)
    return inner

def login(request):
    '''登陸url '''
    if request.method == 'GET':
        return render(request,'login.html')


def index(request):
    if request.method == 'GET':
       '''get模式,獲取cookies的logname賬號名,若是爲空則返回登陸頁面 '''
        u = request.COOKIES.get('logname')
        if not u:
            return redirect('/')
        if request.COOKIES['logname'] == 'admin':
            alluser = models.UserName.objects.exclude(uname='admin')
        else:
            # loguser = request.session['username']
            loguser = request.COOKIES['logname']
            alluser = models.UserName.objects.filter(uname=loguser)
        return render(request, 'index.html', {'u_list': alluser})
    if request.method == 'POST':
        '''賬號登陸驗證 '''
        logname = request.POST.get('logname',None)
        logpwd = request.POST.get('logpwd',None)
        if models.UserName.objects.filter(uname=logname):
            if models.UserName.objects.filter(uname=logname,upwd=logpwd):
                # 登陸驗證成功,重寫cookie的登陸賬號,延時10秒
                response = HttpResponse('ok')
                response.set_cookie('logname',logname,max_age=10)
                return response
            else:
                return HttpResponse('pwderr')
        else:
            return HttpResponse('nmerr')

@auth  # 裝飾器,在訪問url爲account時候,驗證賬號是否爲登陸狀態
def account(request):
    if request.method == 'GET':
        return render(request,'account.html')
'
View Code

 實例:CBV經過裝飾器實現用戶登陸認證jquery

from django import views
from django.utils.decorators import method_decorator
@method_decorator(auth,name='dispatch')
class Order(views.View):
    def get(self,request):
        v = request.COOKIES.get('logname')
        return render(request,'index.html',{'current_user':v})

    def post(self,request):
        v = request.COOKIES.get('logname')
        return render(request,'index.html',{'current_user':v})
View Code
相關文章
相關標籤/搜索