第六章、Cookies和Session

一、来源

由于 http 协议是无状态的,无法记录用户状态,为了能够记录用户状态,就出现了 cookie 和 session (cookie 安全性不足才出现的 session)来识别并保存用户状态

二、cookie工作原理

cookie就是保存在客户端浏览器上的键值对

工作原理:

  • 当你登录成功之后,浏览器上会保存一些信息,下次再访问的时候,就会带着这些信息去访问服务端,服务端通过这些信息来识别出你的身份

cookie 虽然是写在客户端浏览器上的,但其其实是服务端设置的

浏览器可以选择不服从命令 禁止写 cookie (设置,禁用 cookie)

不让写 cookie 的话,所有要保存登录状态的页面都不能登录成功

查看cookie的方式

F12-->application->Cookie

三、session的工作原理

session 是保存在服务端的键值对

Cookie 虽然在一定程度上解决了 “保持状态” 的需求,但是由于 Cookie 本身最大支持 4096 字节,以及 Cookie 本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性,然后就出现了 Session 。

工作原理:

  • 服务端返回给浏览器一个随机的字符串,浏览器以键值对的形式保存(sessionid:随机字符串)
  • 浏览器在访问服务端的时候,就会将这个随机字符串携带上,后端获取随机字符串与后端的记录作对比(随机字符串1:数据1)

四、如何操作cookie

django 操作 cookie 要利用 HttpResponse 对象

(返回给客户端浏览器的都必须是 HttpResponse 对象)

目前HttpResponse()和render()对象都是返回HttpRespose对象

服务端常见的cookie操作

#设置cookie利用的就是HttpResponse对象
obj1.set_cookie('k1','v1') #获取cookie
request.COOKIES.get('k1') #删除cookie
obj1.delete_cookie("k1") #设置超时时间
max_age=None, 超时时间

五、案例

需求:做个登录验证(登陆成功才能访问几个页面)

思考

  • 既然几个网页都需要做登录验证那么我们直接用装饰器

  • *装饰器参数:request, *args, **kwargs (request 如果用位置参数接取不是很方便,直接当做第一个参数好取一些)

  • 跳转到login 登录通过后如何回到上一次未访问的地址(拼接在login/?next=上一次未访问的地址)

  • 登录装饰器

    from functools import wraps
    def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
    if request.COOKIES.get('name'):
    res = func(request,*args,**kwargs)
    return res
    else:
    target_url = request.path_info
    return redirect('/login/?next=%s'%target_url)
    return inner

    科普

    • Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring

    • print(request.path)和print(request.get_full_path())的区别

      request.path只拿url不拿get请求携带的额外的参数,本案例只拿了127.0.0.1:8000/login/的url

      request.get_full_path()啥都拿

    装饰器怎么用?放函数上面就好了

    @login_auth
    def home(request):
    # 校验用户是否登录
    # if request.COOKIES.get('name'):
    # return HttpResponse('我是主页 只有登录了才能看')
    # return redirect('/login/')
    # 上面三行代码是不引入装饰器的原始方法
    return HttpResponse('我是主页 只有登录了才能看')

六、如何操作session

当成一个 字典 来操作就行了

设置session

request.session['key'] = value  # 仅仅只会在内存产生一个缓存
1.django内部自动生成了随机的字符串
2.在django_session表中存入数据
session_key session_data date
随机字符串1 数据1 ...
随机字符串2 数据2 ...
随机字符串3 数据3 ...
3.将产生的随机字符串发送给浏览器 让浏览器保存到cookie中
sessionid:随机字符串

获取session

request.session.get('key')
1.浏览器发送cookie到django后端之后 django会自动获取到cookie值
2.拿着随机字符串去django_session表中比对 是否有对应的数据
3.如果比对上了 就讲随机字符串所对应的数据 取出赋值给request.session
如果对不上 那么request.session就是个空
说明: django session表是针对浏览器的 不同的浏览器来 才会有不同的记录

删除session

request.session.delete()  # 只删除服务端的session
request.session.flush() # 浏览器和服务端全部删除

session也可以设置超时时间

request.session.set_expiry(value多种配置)
数字
0
不写
时间格式

第六章、Cookies和Session的更多相关文章

  1. Cookies和Session的区别

    原文:http://www.cnblogs.com/lijihong/p/4743818.html 今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一 ...

  2. Cookies和Session理论总结

    今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一个小结.本文不讲多,不讲什么高大上的,只是抛出一块砖,讲三个问题:①什么是Cookies和Sessi ...

  3. SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解

    SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解 博客分类: 跟开涛学SpringMVC   6.6.2.@RequestParam绑定单个请求参数值 @RequestParam用于 ...

  4. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

  5. .NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现

    前面为了方便我们只是简单实现了基本业务功能的增删改查,但是登录功能还没有实现,而登录又是系统所必须的,得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能.今天我将带着大家一起来 ...

  6. 有关cookies与session的详细信息

    COOKIES与SESSION 详细信息参考:https://www.cnblogs.com/linguoguo/p/5106618.html 会话(Session)跟踪是Web程序中常用的技术,用来 ...

  7. Java开发工程师(Web方向) - 02.Servlet技术 - 第2章.Cookie与Session

    第2章--Cookie与Session Cookie与Session 浏览器输入地址--HTTP请求--Servlet--HTTP响应--浏览器接收 会话(session):打开浏览器,打开一系列页面 ...

  8. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  9. 2017.11.2 JavaWeb----第六章 Servlet技术

    JavaWeb ------第六章 Servlet技术 (1)在Web应用程序开发中,一般由JSP JavaBean技术和 Servlet技术的结合实现MVC开发模式.在MVC开发模式中将Web程序的 ...

随机推荐

  1. Method org/apache/commons/dbcp/DelegatingResultSet.isClosed()Z is abstract

    按照网络上的排除建议,换成了alibaba的druid. 相关maven依赖如下,注意版本匹配问题 spring版本使用4.3.24.RELEASE <dependency> <gr ...

  2. python 内置数据结构 字符串

    字符串 一个个字符组成的有序的序列,是字符的集合 使用单引号,双引号,三引号引住的字符序列 字符串是不可变对象 Python3起,字符串就是Unicode类型 字符串定义 初始化 s1 = 'stri ...

  3. python基础--字符串、元组

    字符串方法 注:字符串和元组一样都是不可变的,以下函数不会改变原来字符串的值,可以将其赋给一个新的变量 st='a b c d,f,g' st_list=st.split()#字符串分割,参数不写,按 ...

  4. vim实现批量注释和批量删除注释

    批量注释 1.进入文档,vim test.txt 后,按住ctrl+v进入VISUAL BLOCK模式,上下选择需要注释的行 2.按大写键,再按i,或者直接按shift+i,进入INSERT模式,输入 ...

  5. Matlab求微分方程的符号解1

    一.常微分方程的求解 例1. 例2. 例3. 通常我们使用syms 和dsolve来求解: first: second:表示 third:如果有必要 功能函数diff可以完成一元或多元函数任意阶数的微 ...

  6. 通用 spring cloud 微服务模板

    说明文档 功能 1. 基于映射数据库一键生成 spring cloud 微服务 2. 通用 Controller ,无需编写代码即可完成基于数据库的服务 3. 动态多条件 CRUD + 分页 使用说明 ...

  7. 【并行计算-CUDA开发】 NVIDIA Jetson TX1

    概述 NVIDIA Jetson TX1是计算机视觉系统的SoM(system-on-module)解决方案.它组合了最新的NVIDIAMaxwell GPU架构,其具有ARM Cortex-A57 ...

  8. 最新 汇通达java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 汇通达等10家互联网公司的校招Offer,因为某些自身原因最终选择了 汇通达.6.7月主要是做系统复习.项目复盘.Leet ...

  9. [CF707D]Persistent Bookcase_主席树_bitset

    Persistent Bookcase 题目链接:http://codeforces.com/contest/707/problem/D 注释:略. 题解: 发现虽然$q\le 10^5$但是网格是$ ...

  10. *#【Python】【基础知识】【模块】【random】【使用random创造一个随机数】

    Random介绍: 输出随机数. 快照: #!/usr/bin/python # -*- coding: UTF-8 -*- import random #生成 10 到 20 之间的随机数 prin ...