ホームページ  >  記事  >  バックエンド開発  >  Django で Cookie を正しく使用する方法

Django で Cookie を正しく使用する方法

小云云
小云云オリジナル
2018-01-26 11:02:321400ブラウズ

Django では、Cookie の読み取りと設定は非常に簡単です。次に、この記事を通じて Django での Cookie の使用について説明します。興味のある方はぜひご覧ください。

Cookie は、ブラウザーによってクライアントに残される記録であり、メモリまたはハードディスクに保存できます。 HTTP リクエストはステートレスであるため、サーバーまたはクライアントは Cookie レコードを読み取ることでセッション内の状態を維持できます。たとえば、一般的なアプリケーション シナリオはログイン ステータスです。 Django では、Cookie の読み取りと設定は非常に簡単です。 Cookie 自体の形式は辞書に似ているため、リクエストの key または get を通じて取得できます。Cookie をキャンセルしたい場合は、その設定を応答オブジェクトの set_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 ログイン ログイン インターフェイス、インデックス ログイン成功後のジャンプ インターフェイスを設定し、ログインしていない場合は自動的にジャンプします。ログインインターフェース

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 つの方法があることに注意してください。1 つは max_age (N 秒後のタイムアウト) を直接指定する方法、もう 1 つは有効期限の後に特定の時間を指定する方法です。 object

http のみではこの値の取得は禁止されていますが、実際には役に立ちません。Chrome やパケット キャプチャではすべての Cookie を簡単に取得できます

index.html


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

例 2 :

実際には、検証 Cookie 関数は通常、他の関数で直接呼び出すことができるようにデコレータとして記述されます

変更例 1

<!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>

例 3: fbv またはルーティング機能の cbv。例 2 では fbv メソッドを使用していますが、cbv で 1 つのメソッドのみを修飾する場合は、このクラスのすべてのメソッドを修飾する場合は @method_decorator をメソッドの前に直接追加します。次に、クラス全体で

views.py の上部を飾ります

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})

例 4 たとえば、前のページング コードに基づいて、数値をカスタマイズする関数を追加します。表示される行数。

user_list.html これは、Cookie の読み取りと設定を容易にする JQuery プラグインです。さらに、Cookie の使用範囲も制限します (デフォルトのすべての範囲ではなく、パス /user_list

)

@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()),

views.py フロントエンドからページごとの行数を取得し、インスタンス化するときにページング クラスに渡します

<!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>

関連する推奨事項:

Django でセッションの有効期限を設定する方法


Django データベースでの追加、削除、変更、クエリ操作の例

Django での Cookie とセッション インスタンスの操作を比較する

以上がDjango で Cookie を正しく使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。