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 相关文章推荐
文件上传程序的全部源码
Oct 09 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
深入apache配置文件httpd.conf的部分参数说明
Jun 28 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
php中simplexml_load_file函数用法实例
Nov 12 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
Jul 10 PHP
Yii2下session跨域名共存的解决方案
Feb 04 PHP
详解php框架Yaf路由重写
Jun 20 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 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
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
JQuery中getJSON的使用方法
2010/12/13 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
js随机生成一个验证码
2017/06/01 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
俄罗斯游戏商店:Buka
2020/03/01 全球购物
毕业自荐信
2013/12/16 职场文书
护士检查书
2014/01/17 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
师恩难忘教学反思
2014/04/27 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
教代会开幕词
2015/01/28 职场文书
导师工作推荐信
2015/03/27 职场文书
2015年维修工作总结
2015/04/25 职场文书
葬礼主持词
2015/07/02 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android