Cookie和Session介绍

cookie

保存在客户端

session

  1. 保存在服务端
  2. session依赖于cookie,比如服务端想往客户端写东西的时候就把cookie写到客户端浏览器

django自带的session库有以下几点选择

  • a)database-backed session 存数据库
  • b)cached sessions              存缓存
  • c)use file-based sessions    存文件
  • d)cookie-based sessions     存cookie

Cookie

cookies是浏览器为Web服务器存储的一小段信息,每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies.

存取cookies

创建cookie

  1. def cookie(request):
  2. obj = render(request,'cookie.html')
  3. obj.set_cookie("k1","v1") #设置cookie
  4. return obj
  5. #注释:给客户端返回页面的时候顺便设置cookie

获取cookie

  1. def cookie(request):
  2. print(request.COOKIES) #获取所有的cookie
  3. print(request.COOKIES['k2']) #获取key为k2的cookie
  4. obj = render(request,'cookie.html')
  5. obj.set_cookie("k1","v1",path='/cookie')
  6. return obj

创建cookie时的参数

参数 默认值 描述
max_age None cookie生存时间,如果参数是None,这个cookie会延续到浏览器关闭为止
expires None cookie失效的实际日期/时间,格式必须是:Wdy, DD-Mth-YY HH:MM:SS GMT,这个参数会覆盖max_age参数
path "/" cookie对哪个url生效,比如说设置为/login,那么/index页面就看不到cookie
domain None 这个cookie在那个站点生效,如果为None,就是当前站点,如果设为domain=".example.com",则所有带example.com的二级域名站点都可读到cookie
False False 如果设置为True,浏览器将通过HTTPS来回传cookie

Session

示例1:客户端第一次访问index,需要登陆才能访问,第二次就可以直接访问index

进行数据库同步

  1. python3.5 manage.py makemigrations
  2. python3.5 manage.py migrate
  3. #因为django默认会把session信息存放在数据库的django_session表

创建视图

  1. from django.shortcuts import render,HttpResponse,redirect
  2. USER_LIST = {"user1","user2"}
    #登陆函数
  3. def session_login(request):
  4. if request.method == "POST":
  5. u = request.POST.get("user")
  6. p = request.POST.get("pwd")
  7. if p == "" and u in USER_LIST: #如果验证通过
  8. request.session["user"] = u #设置session,
  9. return redirect("/session_index") #跳转到index页面
  10. else:
  11. return render(request,"session_login.html") #如果验证不通过,继续在登陆页面

  12. def auth(func): #这个装饰器的作用就是帮所有需要登陆后才能访问的页面自动验证是否登陆(原理:查看客户端访问页面的时候是否带session_id,)
  13. def inner(request,*args,**kwargs):
  14. user = request.session.get("user") #是否有session信息
  15. if not user: #如果没有
  16. return redirect("/session_login")
  17. return func(request,*args,**kwargs) #如果有就执行被装饰的函数
  18. return inner
  19.  
  20. #主页信息,需要登陆后才能看
  21. @auth
  22. def session_index(request):
  23. return render(request,"session_index.html")

  24. #退出登陆函数
  25. def session_logout(request):
  26. del request.session["user"] #删除session信息
  27. return redirect("/session_login") #然后跳转到login页面

创建路由信息

urls.py

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6. url(r'^session_login/', views.session_login),
  7. url(r'^session_index/', views.session_index),
  8. url(r'^session_logout/', views.session_logout),
  9. ]

创建模板

session_login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="/session_login/" method="POST">
  9. <input type="text" name="user"/>
  10. <input type="text" name="pwd"/>
  11. <input type="submit" value="提交"/>
  12. </form>
  13. </body>
  14. </html>

session_index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>欢迎登陆</h1>
  9. <a href="/session_logout">注销</a>
  10. </body>
  11. </html>

测试第一次访问是否需要登陆才能访问index页面,第二次访问不用登陆,直接就能访问index页面

在客户端查看session信息

在服务端查看session信息

第一段是session_id,第二段加密了的登陆用户名,user1

session是登陆的用户名和session_id保存在服务端中,而客户端只保存一个session_id,django通过读取客户端带的session_id来查找对应的用户名,并返回客户端

流程

  1. 第一次客户端登陆的时候,如果登陆成功,服务端生成一个session_id和登陆的用户名,并保存在数据库的django_session表中,然后跳转到index页面
  2. 然后把session_id写入客户端的浏览器中
  3. 第二次客户端访问会带着session_id访问,服务端检测是否存在,如果存在就直接能访问index

session方法

  1. def index(request):
  2. # 获取、设置、删除Session中数据
  3. request.session['k1']
  4. request.session.get('k1',None)
  5. request.session['k1'] = 123
  6. request.session.setdefault('k1',123) # 存在则不设置
  7. del request.session['k1']
  8.  
  9. # 所有 键、值、键值对
  10. request.session.keys()
  11. request.session.values()
  12. request.session.items()
  13. request.session.iterkeys()
  14. request.session.itervalues()
  15. request.session.iteritems()
  16.  
  17. # 用户session的随机字符串
  18. request.session.session_key
  19.  
  20. # 将所有Session失效日期小于当前日期的数据删除
  21. request.session.clear_expired()
  22.  
  23. # 检查 用户session的随机字符串 在数据库中是否
  24. request.session.exists("session_key")
  25.  
  26. # 删除当前用户的所有Session数据
  27. request.session.delete("session_key")
  28.  
  29. request.session.set_expiry(value)
  30. * 如果value是个整数,session会在些秒数后失效。
  31. * 如果value是个datatimetimedeltasession就会在这个时间后失效。
  32. * 如果value0,用户关闭浏览器session就会失效。
  33. * 如果valueNone,session会依赖全局session失效策略。

session存储选择

存储在数据库

  1. settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
  4.  
  5. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
  6. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径(默认)
  7. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
  8. SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
  9. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
  10. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
  11. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
  12. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

存出在本地目录

  1. a. 配置 settings.py
  2.  
  3. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
  4. SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
  5.  
  6. SESSION_COOKIE_NAME "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
  7. SESSION_COOKIE_PATH "/" # Session的cookie保存的路径
  8. SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
  9. SESSION_COOKIE_SECURE = False # 是否Https传输cookie
  10. SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
  11. SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
  12. SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
  13. SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

  

Django学习系列之Cookie、Session的更多相关文章

  1. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  2. django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法

    django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...

  3. Django学习笔记之Cookie、Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  4. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  5. node学习笔记9——cookie,session相关操作

    下面讲的都是基Express及相关的包.所以在实践本篇文章之前,通过npm安装好Express, cookie-parser, cookie-session这三个安装包. 先简单说一下,如何用Expr ...

  6. Python Web学习笔记之Cookie,Session,Token区别

    一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that i ...

  7. django学习系列——python和php对比

    python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...

  8. Javaweb学习笔记5—Cookie&Session

    今天来讲javaweb的第五阶段学习. Cookie和Session同样是web开发常用到的地方. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的 ...

  9. Django学习系列之request对象

    先来一个简单的实例 urls.py from django.conf.urls import url from django.contrib import admin from cmdb import ...

随机推荐

  1. 理清楚HTML和DHTML和XML的概念

    DHTML 不是 W3C 标准DHTML 指动态 HTML(Dynamic HTML).DHTML 不是由万维网联盟(W3C)规定的标准.DHTML 是一个营销术语 - 被网景公司(Netscape) ...

  2. 企业面试之LeetCode刷题心得

    谈起刷LeetCode的心得,想要先扯点别的,说实话我是比较自虐的人,大学时候本专业从来不好好上,一直觊觎着别人的专业,因为自己文科生,总觉得没有项技术在身出门找工作都没有底气,然后看什么炫学什么,简 ...

  3. ZooKeeper系列(三)

    前面虽然配置了集群模式的Zookeeper,但是为了方面学建议在伪分布式模式的Zookeeper学习Zookeeper的shell命令. 一.Zookeeper的四字命令 Zookeeper支持某些特 ...

  4. swift 与 @objc

    Objective-C entry points https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-in ...

  5. Adobe Dreamweaver CC 2014 代码颜色目录 dw

    他的颜色代码配置文件,不在安装目录下,这让我好找啊~ C:\Users\Administrator\AppData\Roaming\Adobe\Dreamweaver CC 2014\zh_CN\Co ...

  6. CAD参数绘制圆(com接口)

    CAD绘制图像的过程中,画圆的情况是非常常见的,用户可以设置圆的圆心位置及半径属性. 主要用到函数说明: _DMxDrawX::DrawCircle 绘制一个圆.详细说明如下: 参数 说明 DOUBL ...

  7. vue列表排序实现中的this问题

    最近在看vue框架的知识,然后其中有个例子中的this的写法让我很疑惑 <!DOCTYPE html> <html> <head> <meta charset ...

  8. git Please tell me who you are解决方法

    在git创建项目时出现,是因为在创建git文件夹的时候信息不完善导致的下图是正确在git创建项目时出现,是因为在创建git文件夹的时候信息不完善导致的下图是正确1.git init2.git conf ...

  9. Spring Boot . 4 -- 定制 Spring Boot 配置

    覆写 Auto-Configuration 的类 利用外部属性进行动态配置 [本文] 定制 Error 页面 [第二篇] Spring Boot的自动配置可以节省很多无趣的配置工作,但是并不是所有的自 ...

  10. Chrome插件:微信公众号自动登录(chrome.extension)

    manifest.json: { "manifest_version": 2, "name": "WX.AutoLogin", " ...