cookie

http请求时无状态的,一个客户端第一次,第二次,第n次访问同一个服务器都是一样的,服务器都会按照一个新的连接处理。但是,有时候客户端需要服务器记住客户端的登录状态,譬如离开一会,回来之后,仍然保持着之前的登录状态。这时候就需要cookie和session。

cookie: 是服务器发送的保存在客户端的一个字符串,浏览器每次请求是都会带上cookie,例如,把用户名和密码保存在cookie中,只要cookie没有过期,以后用户每次登录都可以自动登录,不需要再输入用户名和密码。

session: 是保存在服务器端的一个大的字典,浏览器第一次访问服务器的时候,服务器把sessionid传到浏览器,然后浏览器把sessionid保存在lcookie中,每次访问时,带上这个标识,服务器就可以标识这个请求来自哪个用户。

cookie与session的详细介绍可以查看,cookie与session

一个简单的实例来说明cookie的用法:

django写两个页面,一个登录页面,登录成功之后跳转到另一个页面:

模板html代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8">{% block title %}{% endblock %}<style>.pg-header{position: fixed;right: 0;left: 0;top: 0;height: 48px;background-color: #2459a2;}.pg2{color: white;display: inline-block;padding: 0 10px 0 10px;text-decoration:none;}.pg2:hover{background-color: blue;}.body_css{margin-top: 50px;}</style>
</head>
<body><div class="pg-header"><div style="width: 980px; margin: 0 auto; line-height: 48px;"><a class="pg2" href="https://www.feidai.com">LOGO</a><a class="pg2" href="https://www.feidai.com">论坛</a><a class="pg2" href="https://www.feidai.com">天下</a><a class="pg2">UFO</a></div></div><div class="body_css">{% block content %}{% endblock %}</div>
</body>
</html>

master.html模板文件

登录页面如下,

{% extends "master.html" %}{% block title %}<title>登录</title>
{% endblock %}{% block content %}<form action="/login" method="post"><input type="text"  name="username" placeholder="用户名"><input type="password" name="pwd" placeholder="密码" ><input type="submit" value="登录"></form>
{% endblock %}

login.html

登录成功之后,跳转的页面如下:

{% extends "master.html" %}
{% block title %}测试继承
{% endblock %}{% block content %}<h1>东周列国志</h1><textarea name="dzlgz" id="" cols="30" rows="10" style="width: 260px">道德三皇五帝,功名夏后商周。英雄五霸闹春秋,顷刻兴亡过手。青史几行名姓,北郊无数荒丘。前人田地后人收,说甚龙争虎斗。</textarea><h1>欢迎登录{{ current_user }}</h1>
{% endblock %}

index.html页面

各个页面对应的视图函数如下:因为只是为了验证,代码中使用字典存储了两个用户的信息。

def index(request):v = request.COOKIES.get("username22")if v:return render(request, "one.html", {"current_user": v})else:return HttpResponse("GUN")user_dict = {"wangxz": {"passwd": "123123"},"lfy": {"passwd": "kkkkk"}}def login(request):if request.method == "GET":return render(request, "login.html")elif request.method == "POST":u = request.POST.get("username")p = request.POST.get("pwd")user = user_dict.get(u)if not user:return render(request, "login.html")if user["passwd"] == p:res = redirect("/index")# 这只cookie关闭浏览器就失效res.set_cookie("username22", u)return reselse:return HttpResponse("用户名或密码错误")

对应的视图函数

在login函数中,我们使用了django自带的set_cookie函数来设置了cookie。

然后运行django,验证一下设置的cookie,在上面的index视图函数中加入打印语句,print(v);

在浏览器输入http://127.0.0.1:8000/login然后输入用户名和密码;点击登录可以看到如下,请求过程。

  1. 首先请求login页面,服务器会把cookie作为响应的一部分,传入到浏览器,然后浏览器把cookie存储到本地。
  2. 点击登录后,页面跳转到index,浏览器会把cookie作为请求的一部分传入到服务器,服务器会收到浏览器的请求。

查看logni的响应部分如下:

index的请求报文如下:

服务端print语句得到的结果如下:

这样默认的设置,cookie的有效期为浏览器关闭之后,cookie即失效,我们可以对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获取(不是绝对,底层抓包可以获取到也可以被覆盖)

  • 设置cookie的有效期为5s:  res.set_cookie("username22", u, max_age=5),

这样设置cookie的有效期,cookie是从第一次登陆界面开始计算,正常是,cookie有效期是从,最后一次登陆开始,可以这样设置,如下:

current_time = datetime.datetime.utcnow()
current_data = current_time + datetime.timedelta(seconds=10)
response.set_cookie('key','value',expires=current_data)

上面的cookie我们使用的明文传输,还可以使用加密的方式传输。

cookie 将字符串进行salt加解密,写法如下:
obj = HttpResponse('s')
obj.set_signed_cookie('username','jack',salt='adfadf') # 通过salt进行加密
request.get_signed_cookie('username',salt='adfadf') # 通过原来的salt进行解密

cookie的应用之二:

在访问有许多类似excel表格的页面时,我们希望,可以改变每个页面输出的数据的条目数量,这个数量从前端到后端的传输,我们可以使用cookie来处理,如下:

cookie是存储在客户端的,session是存储在服务器端的。

session

django中默认支持session,其中提供了5种方式来存储session。

  • 数据库(默认的)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

数据库

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。a. 配置 settings.pySESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)b. 使用def index(request):# 获取、设置、删除Session中数据request.session['k1']request.session.get('k1',None)request.session['k1'] = 123request.session.setdefault('k1',123) # 存在则不设置del request.session['k1']# 所有 键、值、键值对request.session.keys()request.session.values()request.session.items()request.session.iterkeys()request.session.itervalues()request.session.iteritems()# 用户session的随机字符串request.session.session_key# 将所有Session失效日期小于当前日期的数据删除request.session.clear_expired()# 检查 用户session的随机字符串 在数据库中是否request.session.exists("session_key")# 删除当前用户的所有Session数据request.session.delete("session_key")request.session.set_expiry(value)* 如果value是个整数,session会在些秒数后失效。* 如果value是个datatime或timedelta,session就会在这个时间后失效。* 如果value是0,用户关闭浏览器session就会失效。* 如果value是None,session会依赖全局session失效策略。

数据库存储session

html页面和上面的一样,需要更改的是视图函数,视图函数如下:

def login(request):if request.method == "GET":return render(request, "login.html")if request.method == "POST":user = request.POST.get("user", None)pwd = request.POST.get("pwd", None)if user == "wangxz" and pwd == "123":request.session["username"] = userrequest.session.set_expiry(10)return redirect("/index")else:return render(request, "login.html")def index(request):ses = request.session.get("username", None)print(ses)if ses:return HttpResponse("OK")else:return HttpResponse("gun")

session存储数据库

上面代码设置了session存储在数据库中,有效期为10s,django默认使用sqlite存储,因此,启动之前需要使用如下两个命令,创建对应的表。

python manage.py  makemigrations
python manage.py migrate 

访问页面输入密码,可以在数据库中发现对应的session数据:

转载于:https://www.cnblogs.com/wxzhe/p/9602683.html

Django框架介绍之cookie与session相关推荐

  1. Django框架——状态保持(cookie、session)

    目录 1.cookie 2.session 1.cookie 设置: HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期 ...

  2. Django框架介绍及配置

    Django框架介绍及配置 一, WEB框架介绍 1.1Web应用程序处理流程 1.2Web框架程序的意义 用于搭建Web应用程序 免去不同Web应用相同代码部分的重复 1.3 Web应用程序的本质 ...

  3. 一、Django框架介绍

    一.Django框架介绍 1.1 框架背景 ​ 要学习一个框架,了解它的诞生,背景,特点是必不可少的.只有对框架有足够多的了解才能确定这个框架是否适合你自己,当然实践是最好的老师,不能仅凭我一面之词来 ...

  4. python框架django文档_Django基础——Django框架介绍及模板语言

    Django框架,我们只需要关心二点: 1.根据用户访问不同的路径执行不同的函数 2.从HTML读取出内容,并且完成字符串的替换 而socket通信不需要我们自己写: 新建Django项目 命令行创建 ...

  5. Django框架介绍 day01

    再说Django之前先来说一下什么是web应用 软件开发架构 c/s架构 客户端 服务端 b/s架构 浏览器 服务器 本质:b/s架构其实也是c/s架构 HTTP协议 超文本传输协议:规定了客户端与服 ...

  6. 【django轻量级框架】Django框架介绍与安装

  7. 师傅带徒弟学:Python Web之Django框架-关东升-专题视频课程

    师傅带徒弟学:Python Web之Django框架-475人已学习 课程介绍         Python Web是Python语言一个重要的应用方面,Python Web有很多,其中Flask和D ...

  8. Django框架设置cookies与获取cookies操作详解

    本文实例讲述了Django框架设置cookies与获取cookies操作.分享给大家供大家参考,具体如下: 在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是req ...

  9. Cookie、Session、Token、JWT区别与联系

    本文来说下与安全相关的话题,Cookie.Session.Token.JWT相关的知识与内容 文章目录 无状态的HTTP协议 什么是认证(Authentication) 什么是授权(Authoriza ...

最新文章

  1. 请你描述一下 cookies,sessionStorage 和 localStorage 的区别?
  2. openpose_net随机搜索网络源代码
  3. 基于MATLAB的小波去噪
  4. OS / 进程中某个线程崩溃,是否会对其他线程造成影响?
  5. trie树java_【数据结构】Trie树的应用:查询IP地址的ISP(Java实现)
  6. mybatis中#和$区别
  7. SqlDataReader对象的NextResult方法读取存储过程多个结果集
  8. ajax后台怎么取mapp,后台管理实现
  9. Volatile的陷阱
  10. 前端学习(570):margin负值下的等高布局
  11. 中国消费者为何不愿为App付费?
  12. oracle tb级别数据量,备份TB级别Oracle数据库的一些技巧
  13. mysql获取分组后每组的最大值
  14. 宣城市加快运用大数据推动全域旅游发展
  15. Linux里如何查找文件内容
  16. 15个很有用的 HTML5 基础教程和速查手册
  17. 爬取搜狗词库测试可行
  18. adc0809工作过程C语言,ADC0809引脚图、时序图、工作流程图详解
  19. Java获取微信用户昵称时昵称里有特殊符号导致插入数据库失败(解决方案)
  20. macmini作为远程服务器,160台Mac mini组成的终极服务器

热门文章

  1. Google/glog
  2. linux ubuntu 上安装rar 压缩软件
  3. Pycharm报错:\Scripts\activate.ps1 cannot be loaded because running scripts is disabled on this system
  4. Mysql进阶四:常见函数-日期函数
  5. 米扑博客:总结分享 WordPress显示评论者IP归属地、浏览器、终端设备、电信运营商... 1
  6. DevC++ 报错[Error] Id returned 1 exit status
  7. 骁龙778gplus和骁龙870差多少 哪个好
  8. 关键词排名查询工具主要有哪些?
  9. Python爬虫入门,详细讲解爬虫过程
  10. oppo手机忘记解锁图案怎么办