Django中cookie如何正確使用

來源:互聯網
上載者:User
Django裡面,對cookie的讀取和設定很簡單。接下來通過本文給大家分享Django 中 cookie的使用,感興趣的朋友一起看看吧,希望能協助到大家。

Cookie是瀏覽器在用戶端留下的一段記錄,這段記錄可以保留在記憶體或者硬碟上。因為Http請求是無狀態的,通過讀取cookie的記錄,伺服器或者用戶端可以維持會話中的狀態。比如一個常見的應用情境就是登入狀態。Django裡面,對cookie的讀取和設定很簡單。Cookie本身的格式類似字典,因此可以通過request的key或者get擷取;然後他的設定則是通過response對象的set_cookie設定; 如果要取消cookie,把到期時間設定為目前時間就行了。

擷取Cookie:


request.COOKIES['key']request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)  參數:    default: 預設值    salt: 加密鹽    max_age: 後台控制到期時間

設定Cookie:


rep = HttpResponse(...) 或 rep = render(request, ...)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擷取(不是絕對,底層抓包可以擷取到也可以被覆蓋)

例1 設定一個login登入介面,一個index登入成功之後的跳轉介面,如果沒有登入那麼自動跳轉到登入介面

views.py


def index(reqeust):  # 擷取當前已經登入的使用者  v = reqeust.COOKIES.get('username111')  if not v:    return redirect('/login/')  return render(reqeust,'index.html',{'current_user': v})

注意Cookie的逾時時間有2種方式,一個是直接指定max_age(N秒後逾時),一個是指定expires後面跟一個具體的時間對象

httponly可以禁止JavaScript擷取這個值,但是實際上沒有什麼鳥用,chrome或者抓包都能輕鬆擷取所有的cookie

index.html


<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title></title></head><body>  <h1>歡迎登入:{{ current_user }}</h1></body></html>

login.html


<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title></title></head><body>  <form action="/login/" method="POST">    <input type="text" name="username" placeholder="使用者名稱" />    <input type="password" name="pwd" placeholder="密碼" />    <input type="submit" />  </form></body></html>

例2:

現實生活中,一般是把這個驗證cookie的功能寫成裝飾器,這樣直接在其他函數上面調用就行了

把例1改一下


def auth(func):  def inner(reqeust,*args,**kwargs):    v = reqeust.COOKIES.get('username111')    if not v:      return redirect('/login/')    return func(reqeust, *args,**kwargs)  return inner@authdef index(reqeust):  # 擷取當前已經登入的使用者  v = reqeust.COOKIES.get('username111')  return render(reqeust,'index.html',{'current_user': v})

例3: 我們知道可以使用fbv或者cbv來路由函數。例2使用了fbv的方式,用cbv也能實現

cbv裡面,如果只打算裝飾一個方法,那麼直接在方法前面加個@method_decorator就行;如果打算裝飾這個類裡面所有的方法,那麼在整個類的最上面進行裝飾

views.py


@method_decorator(auth,name='dispatch')class Order(views.View):  # @method_decorator(auth)  # def dispatch(self, request, *args, **kwargs):  #   return super(Order,self).dispatch(request, *args, **kwargs)  # @method_decorator(auth)  def get(self,reqeust):    v = reqeust.COOKIES.get('username111')    return render(reqeust,'index.html',{'current_user': v})  def post(self,reqeust):    v = reqeust.COOKIES.get('username111')    return render(reqeust,'index.html',{'current_user': v})urls.py url(r'^order/', views.Order.as_view()),

例4 我們還可以通過JavaScript或者JQuery來設定Cookie,比如在前面分頁的代碼基礎上,我們增加一個自訂顯示行數的功能。

user_list.html 這裡下了一個JQuery的外掛程式,這樣讀取設定cookie比較容易;而且,我們還限制了cookie的使用範圍,不是預設的所有範圍,而是僅僅局限於/user_list這個路徑裡面


<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title></title>  <style>    .go{      width:20px;       border: solid 1px;      color: #66512c;      display: inline-block;      padding: 5px;    }    .pagination .page{      border: solid 1px;      color: #66512c;      display: inline-block;      padding: 5px;      background-color: papayawhip;      margin: 5px;    }    .pagination .page.active{      background-color: brown;      color: white;    }  </style></head><body>  <ul>    {% for item in li %}      {% include 'li.html' %}    {% endfor %}  </ul>  <p>    <select id="ps" onchange="changePageSize(this)">      <option value="10">10</option>      <option value="30">30</option>      <option value="50">50</option>      <option value="100">100</option>    </select>  </p>  <p class="pagination">    {{ page_str }}  </p>  <script src="/static/jquery-1.12.4.js"></script>  <script src="/static/jquery.cookie.js"></script>  <script>    $(function(){        var v = $.cookie('per_page_count', {'path': "/user_list/`"});        console.log(v)        $('#ps').val(v);    });    function changePageSize(ths){      var v = $(ths).val();      console.log(v);      $.cookie('per_page_count',v, {'path': "/user_list/"});           location.reload();    }  </script></body></html>

views.py 從前端擷取每頁行數,執行個體化的時候傳遞給我們的分頁類


def user_list(request):  current_page = request.GET.get('p', 1)  current_page = int(current_page)  val = request.COOKIES.get('per_page_count',10)  val = int(val)  page_obj = pagination.Page(current_page,len(LIST),val)  data = LIST[page_obj.start:page_obj.end]  page_str = page_obj.page_str("/user_list/")  return render(request, 'user_list.html', {'li': data,'page_str': page_str})

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.