Maison  >  Article  >  développement back-end  >  Comment utiliser correctement les cookies dans Django

Comment utiliser correctement les cookies dans Django

小云云
小云云original
2018-01-26 11:02:321456parcourir

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: 后台控制过期时间

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获取(不是绝对,底层抓包可以获取到也可以被覆盖)

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

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


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


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!

Déclaration:
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