Comment utiliser correctement les cookies dans Django

小云云
Libérer: 2023-03-19 16:44:01
original
1439 Les gens l'ont consulté

Dans Django, la lecture et le paramétrage des cookies sont très simples. Ensuite, je partagerai avec vous l'utilisation des cookies dans Django à travers cet article. Les amis intéressés devraient y jeter un œil. J'espère que cela pourra aider tout le monde.

Le cookie est un enregistrement déposé par le navigateur sur le client. Cet enregistrement peut être conservé en mémoire ou sur le disque dur. Étant donné que les requêtes HTTP sont sans état, le serveur ou le client peut maintenir l'état de la session en lisant les enregistrements de cookies. Par exemple, un scénario d'application courant est le statut de connexion. Dans Django, la lecture et le paramétrage des cookies sont très simples. Le format du cookie lui-même est similaire à celui d'un dictionnaire, il peut donc être obtenu via la clé ou get de la requête ; puis son paramètre est défini via le set_cookie de l'objet de réponse, si vous souhaitez annuler le cookie, définissez simplement le paramètre ; délai d'expiration à l'heure actuelle.

Obtenir un cookie :


request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
  参数:
    default: 默认值
    salt: 加密盐
    max_age: 后台控制过期时间
Copier après la connexion

Définir un 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获取(不是绝对,底层抓包可以获取到也可以被覆盖)
Copier après la connexion

Exemple 1 : configurez une interface de connexion, une interface de saut après une connexion à l'index réussie. Si vous n'êtes pas connecté, il passera automatiquement à l'interface de connexion

vues. py


def index(reqeust):
  # 获取当前已经登录的用户
  v = reqeust.COOKIES.get('username111')
  if not v:
    return redirect('/login/')
  return render(reqeust,'index.html',{'current_user': v})
Copier après la connexion

Notez qu'il existe deux façons de définir le délai d'expiration du cookie, l'une consiste à spécifier directement max_age (délai d'expiration après N secondes), l'autre consiste à spécifier expire suivi d'un objet temporel spécifique

httponly peut empêcher JavaScript d'obtenir cette valeur, mais c'est en réalité inutile. Chrome ou la capture de paquets peuvent facilement obtenir tous les cookies

index.html

<🎜. >


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <h1>欢迎登录:{{ current_user }}</h1>
</body>
</html>
Copier après la connexion
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>
Copier après la connexion
Exemple 2 :

Dans la vraie vie, ce cookie de vérification la fonction est généralement utilisée Écrivez-le en tant que décorateur, afin de pouvoir l'appeler directement sur d'autres fonctions

Modifier l'exemple 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})
Copier après la connexion
Exemple 3 : Nous sachez qu'on peut utiliser fbv ou cbv pour acheminer des fonctions. L'exemple 2 utilise la méthode fbv, qui peut également être implémentée à l'aide de cbv. Dans cbv, si vous prévoyez de décorer une seule méthode, ajoutez simplement @method_decorator directement devant la méthode si vous prévoyez de décorer toutes les méthodes de cette classe. décorer le haut de toute la classe

views.py


Exemple 4 Nous pouvons également définir des cookies via JavaScript ou JQuery, tels que Based on Au code de pagination précédent, nous ajoutons une fonction pour personnaliser le nombre de lignes affichées.

@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()),
Copier après la connexion
user_list.html Voici un plug-in JQuery, qui facilite la lecture et la configuration des cookies. De plus, nous limitons également la portée de l'utilisation des cookies, pas toutes les portées par défaut, mais uniquement limitées à /user_list ; Dans le chemin


views.py obtient le nombre de lignes par page depuis le front-end et le transmet à notre classe de pagination lorsqu'il est instancié

<!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>
Copier après la connexion


Recommandations associées :

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})
Copier après la connexion


Comment définir l'heure d'expiration de la session avec Django

Ajout d'une base de données Django , supprimer, modifier et vérifier les opérations Exemples

Comparez les opérations de cookie et d'instance de session dans Django

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!