Django 中 cookie的使用


Posted in PHP onAugust 17, 2017

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
@auth
def 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>
  <div>
    <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>
  </div>
  <div class="pagination">
    {{ page_str }}
  </div>
  <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})

总结

以上所述是小编给大家介绍的Django 中 cookie的使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
自动把纯文本转换成Web页面的php代码
Aug 27 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
Aug 14 PHP
PHP命令行脚本接收传入参数的三种方式
Aug 20 PHP
php实现的双向队列类实例
Sep 24 PHP
php正则表达式获取内容所有链接
Jul 24 PHP
Zend Framework动作助手FlashMessenger用法详解
Mar 05 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
Sep 18 PHP
PHP中引用类型和值类型功能与用法示例
Feb 26 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
Sep 08 PHP
PHP面向对象中new self()与 new static()的区别浅析
Aug 17 #PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
Aug 17 #PHP
PHP实现执行外部程序的方法详解
Aug 17 #PHP
laravel通过创建自定义artisan make命令来新建类文件详解
Aug 17 #PHP
Laravel中的Auth模块详解
Aug 17 #PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 #PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 #PHP
You might like
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
php数组随机排序实现方法
2015/06/13 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
jquery实现手风琴效果
2015/11/20 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
使用Node.js写一个代码生成器的方法步骤
2019/05/10 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
酒后驾驶检讨书
2014/01/27 职场文书
建议书的格式
2014/05/12 职场文书
校本教研活动总结
2014/07/01 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
2014公司年终工作总结
2014/12/19 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
Python答题卡识别并给出分数的实现代码
2021/06/22 Python