Django框架介绍之cookie与session
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 res
else:
return HttpResponse("用户名或密码错误")
对应的视图函数
在login函数中,我们使用了django自带的set_cookie函数来设置了cookie。
然后运行django,验证一下设置的cookie,在上面的index视图函数中加入打印语句,print(v);
在浏览器输入http://127.0.0.1:8000/login然后输入用户名和密码;点击登录可以看到如下,请求过程。
- 首先请求login页面,服务器会把cookie作为响应的一部分,传入到浏览器,然后浏览器把cookie存储到本地。
- 点击登录后,页面跳转到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.py
SESSION_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'] = 123
request.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)
":
request.session["username"] = user
request.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数据:

续
Django框架介绍之cookie与session的更多相关文章
- Django框架中的Cookie和Session
学习内容: (1)cookie (2)session Web是基于请求/响应模式,HTTP协议是无状态的,但是基于 Internet的各种服务系统应运而生,建立商业站点或者功能比较完善的个人站点,常常 ...
- django框架中的cookie与session
cookie因为http是一个无状态协议,无法记录用户上一步的操作,所以需要状态保持.cookie和session的区别:1.cookie是保存在浏览器本地的,所以相对不安全.cookie是4k的大小 ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- Python的Django框架中的Cookie相关处理
Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...
- day 62.3 Django基础八之cookie和session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx ...
- day 73 Django基础八之cookie和session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 x ...
- Django基础六之cookie和session
Django基础六之cookie和session 目录 Django基础六之cookie和session 1. cookie和session介绍 1.1 cookie 简介 1.2 cookie的缺陷 ...
- Django 框架介绍
Django 框架介绍 MVC框架和MTV框架 简单了解一下什么是MVC框架.MVC(Model View Controller),是模型(model)-视图(view)-控制器(controller ...
- 第三百零三节,Django框架介绍——用pycharm创建Django项目
Django框架介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内 ...
随机推荐
- Centos7.2修改时区
设置时区同样, 在 CentOS 7 中, 引入了一个叫 timedatectl 的设置设置程序. 用法很简单: # timedatectl # 查看系统时间方面的各种状态 Local time: 四 ...
- IIS7.5 配置虚拟目录的经历
好多网站为了不带上什么端口号所有就建立虚拟目录的试来使用80端口 iis6设置都没有问题可到了7.5碰到了点问题 原来7.5上有个:添加应用程序和添加虚拟目录.还有个转换为应用程序 直接把网站建成虚拟 ...
- CodeForces 832B Petya and Exam
B. Petya and Exam time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 1.tTensorboard
Windows下坑太多...... 在启动TensorBoard的过程,还是遇到了一些问题.接下来简单的总结一下我遇到的坑. 1.我没找不到log文件?! 答: ...
- CF989C A Mist of Florescence 构造
正解:构造 解题报告: 先放传送门yep! 然后构造题我就都直接港正解了QwQ没什么可扯的QwQ 这题的话,首先这么想吼 如果我现在构造的是个4*4的 举个栗子 AABB ACBB AADB DBCA ...
- SQL实现交,并,差操作
有的数据库不支持intersect,except,所以交集,和差集使用嵌套查询来做比较靠谱. a表和b表具有完全一样的结构 mysql> desc a; +-------+----------- ...
- [py][mx]django使用class写views-免去判断方法的烦恼
修改views使用class模式 类模式写views - 免去了函数模式的判断的烦恼 users/views.py from django.views.generic import View clas ...
- break continue练习
break :跳出 1.当break单独存在时,下面不要定义其他语句,因为执行不到. 2.如果出现了循环嵌套,break响应跳出指定的循环,可以通过标号来完成 例如: continue:要么是swit ...
- application实例
application详解及实例 application对象用来在多个程序或者是多个用户之间共享数据,用户使用的所有application对象都是一样的,这与session对象不同.服务器一旦启动,就 ...
- ios 工作日志
1.设计模式 1.1 想用一个controllerK控制多个页面的切换 但是每一个页面必须要引用这个controller,这样才能控制进度, 所以必须是弱引用.controller必须被某一个实例强引 ...