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 相关文章推荐
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
php中怎么搜索相关联数组键值及获取之
Oct 17 PHP
php调用google接口生成二维码示例
Apr 28 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
php设计模式之委托模式
Feb 13 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
浅谈laravel框架与thinkPHP框架的区别
Oct 23 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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
PR值查询 | PageRank 查询
2006/12/20 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
jquery选择器使用详解
2014/04/08 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
python中mechanize库的简单使用示例
2014/01/10 Python
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
微信公众号token验证失败解决方案
2019/07/22 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
python实现UDP协议下的文件传输
2020/03/20 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
工作表现自我评价
2014/02/08 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
公司慰问信范文
2015/03/23 职场文书
信仰纪录片观后感
2015/06/08 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers