文章目录
1、会话技术2、cookie、session、token3、cookie3.1、定义3.2、基本原理3.3、django中cookie的简单使用3.3.1、设置cookie3.3.2、获取cookie3.3.3、删除cookie
3.4、cookie常用操作总结3.5、cookie版登录校验3.5.1、路由3.5.2、视图函数3.5.3、模板3.5.3.1、login.html3.5.3.2、order.html3.5.3.3、userinfo.html
4、session4.1、定义4.2、django中session的使用4.3、django中session的配置
1、会话技术
在B
/S
(浏览器
/服务器
)的互联网架构中,保持在一定周期内,浏览器与服务器间会话数据的一种技术
典型的实现方式有两种
:
cookie 和 session
其中cookie是根本
,Session是高级实现
(session也是基于cookie
)
之所有要有会话技术,因为b
/s架构是无状态的
,任何的请求间都没有丝毫联系!
其目的
:
1、在同一个浏览器的多次请求将,可以存储数据。
2、严格区分浏览器。
2、cookie、session、token
cookie
: 客户端浏览器上的键值对
session
: 存在服务端的键值对
token
: 加密的键值对,如果放在客户端浏览器上,它就叫cookie,服务端签发的加密字符串,如果在app上就叫token
3、cookie
3.1、定义
cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息
当前网站在浏览器上cookie个数和大小有限制
cookie大小上限为4KB
一个服务器最多在客户端浏览器上保存
20个cookie
一个浏览器最多保存
300个cookie
3.2、基本原理
服务器端脚本在浏览器端存储数据的一种技术
1、cookie会话数据存储在浏览器端
2、浏览器在每次请求服务器程序时,会将该服务器所存储的cookie,携带到服务器端
3、究竟存储那些数据由服务器决定
3.3、django中cookie的简单使用
3.3.1、设置cookie
def cookie_set(request
):
obj
= HttpResponse
('设置cookie')
obj
.set_cookie
('name','allen')
obj
.set_cookie
('age','19')
return obj
max_age
: 传数字,以秒计,过期时间,有默认值
(5天后过期:
60*60*24*5)
expires
: 传时间对象,date
=datetime
.timedelta
()
path
: 默认
/表示当前域下的所有路径 http
://127.0.0.1:8000/allen
/xxx
/
domain
: 在那个域下有效
secure
: 是否Https传输cookie
httponly
: cookie只支持http传输
3.3.2、获取cookie
def cookie_get(request
):
print(request
.COOKIES
)
print(request
.COOKIES
.get
('name'))
return HttpResponse
('获取cookie')
3.3.3、删除cookie
def cookie_delete(request
):
obj
= HttpResponse
('删除指定cookie ')
obj
.delete_cookie
('name')
return obj
3.4、cookie常用操作总结
增
: obj
.set_cookie
('key','value')
删
: obj
.delete_cookie
('key')
查
: request
.COOKIES
.get
('key')
改
: obj
.set_cookie
('key','value1')
增
: obj
.set_signed_cookie
('key','value','密钥')
删
: obj
.delete_cookie
('key')
查
: request
.get_signed_cookie
('key',salt
='密钥')
改
: obj
.set_signed_cookie
('key','value1','密钥')
3.5、cookie版登录校验
3.5.1、路由
path
('login/', views
.login
),
path
('order/', views
.order
),
path
('logout/', views
.logout
),
path
('userinfo/', views
.userinfo
),
3.5.2、视图函数
def login_auth(func
):
def inner(request
, *args
, **kwargs
):
name
= request
.COOKIES
.get
('name')
if name
:
res
= func
(request
, *args
, **kwargs
)
return res
else:
path
= request
.get_full_path
()
return redirect
('/login/?returnUrl=%s' % path
)
return inner
def login(request
):
if request
.method
== 'GET':
return render
(request
, 'login.html')
else:
name
= request
.POST
.get
('name')
password
= request
.POST
.get
('password')
if name
== 'allen' and password
== '123':
path
= request
.GET
.get
('returnUrl')
if path
:
obj
= redirect
(path
)
else:
obj
= redirect
('/index/')
obj
.set_cookie
('name', name
)
return obj
else:
return HttpResponse
('用户名或密码错误')
def order(request
):
name
= request
.COOKIES
.get
('name')
if name
:
return render
(request
,'order.html')
else:
return redirect
('/login')
@login_auth
def order(request
):
return render
(request
, 'order.html')
@login_auth
def userinfo(request
):
return render
(request
, 'userinfo.html')
def logout(request
):
obj
= HttpResponse
('退出登录成功')
obj
.delete_cookie
('name')
return obj
3.5.3、模板
3.5.3.1、login.html
<form action="" method="post">
<p>用户名:
<input type="text" name="name"></p>
<p>密码:
<input type="password" name="password"></p>
<p><input type="submit" value="提交"></p>
</form>
3.5.3.2、order.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title
</title>
</head>
<body>
<a href="/logout/">点我退出
</a>
</body>
</html>
3.5.3.3、userinfo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title
</title>
</head>
<body>
<h1>用户信息页面
</h1>
</body>
</html>
4、session
4.1、定义
1、存在于服务端的键值对
2、同一个浏览器不允许登录多个账户,不同浏览器可以登录同一个账户
4.2、django中session的使用
重要
: 必须迁移数据库!!!
增
: request
.session
['key']=value
查
: request
.session
['key']
改
: request
.session
['key']=value1
删
: del request
.session
['key']
设置过期时间
: request
.session
.set_expiry
(10)
request
.session
.setdefault
('key',value
)
request
.session
.get
('key',None)
del request
.session
['key']
request
.session
.keys
()
request
.session
.values
()
request
.session
.items
()
request
.session
.session_key
request
.session
.clear_expired
()
request
.session
.exists
("session_key")
request
.session
.delete
()
request
.session
.flush
()
4.3、django中session的配置
1、数据库Session
SESSION_ENGINE
= 'django.contrib.sessions.backends.db'
2、缓存Session
SESSION_ENGINE
= 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS
= 'default'
3、文件Session
SESSION_ENGINE
= 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH
= None
4、缓存
+数据库
SESSION_ENGINE
= 'django.contrib.sessions.backends.cached_db'
5、加密cookie session
SESSION_ENGINE
= 'django.contrib.sessions.backends.signed_cookies'
其他公用设置项
:
SESSION_COOKIE_AGE
= 1209600
SESSION_EXPIRE_AT_BROWSER_CLOSE
= False
SESSION_COOKIE_NAME =
"sessionid"
SESSION_COOKIE_PATH =
"/"
SESSION_COOKIE_DOMAIN
= None
SESSION_COOKIE_SECURE
= False
SESSION_COOKIE_HTTPONLY
= True
SESSION_SAVE_EVERY_REQUEST
= False