首頁  >  文章  >  後端開發  >  分析Django中cookie的用法

分析Django中cookie的用法

巴扎黑
巴扎黑原創
2017-08-18 11:07:271418瀏覽

Cookie是瀏覽器在客戶端留下的記錄,這段記錄可以保留在記憶體或硬碟上。 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(&#39;username111&#39;)
    if not v:
      return redirect(&#39;/login/&#39;)
    return func(reqeust, *args,**kwargs)
  return inner
@auth
def index(reqeust):
  # 获取当前已经登录的用户
  v = reqeust.COOKIES.get(&#39;username111&#39;)
  return render(reqeust,&#39;index.html&#39;,{&#39;current_user&#39;: v})

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

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

views.py


@method_decorator(auth,name=&#39;dispatch&#39;)
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(&#39;username111&#39;)
    return render(reqeust,&#39;index.html&#39;,{&#39;current_user&#39;: v})
  def post(self,reqeust):
    v = reqeust.COOKIES.get(&#39;username111&#39;)
    return render(reqeust,&#39;index.html&#39;,{&#39;current_user&#39;: v})
urls.py
 url(r&#39;^order/&#39;, 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 &#39;li.html&#39; %}
    {% 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(&#39;per_page_count&#39;, {&#39;path&#39;: "/user_list/`"});
        console.log(v)
        $(&#39;#ps&#39;).val(v);
    });
    function changePageSize(ths){
      var v = $(ths).val();
      console.log(v);
      $.cookie(&#39;per_page_count&#39;,v, {&#39;path&#39;: "/user_list/"});     
      location.reload();
    }
  </script>
</body>
</html>

views.py  從前端取得每頁行數,實例化的時候傳遞給我們的分頁類別


def user_list(request):
  current_page = request.GET.get(&#39;p&#39;, 1)
  current_page = int(current_page)
  val = request.COOKIES.get(&#39;per_page_count&#39;,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, &#39;user_list.html&#39;, {&#39;li&#39;: data,&#39;page_str&#39;: page_str})

以上是分析Django中cookie的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn