会话跟踪技术
- 在一个会话的多个请求中共享数据
- 会话路径技术使用Cookie或session完成
- HTTP协议是无状态协议,也就是说每一个请求都是独立的!没法记录前一次请求的状态。但HTTP协议中可使用Cookie来完成会话跟踪!在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术。
Cookie
Cookie是由服务器建立,经过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪一个服务器的Cookie),当客户端向服务器发出请求时会把全部这个服务器Cookie包含在请求中发送给服务器,这样服务器就能够识别客户端了!html
- 不一样浏览器之间是不共享Cookie的
- 保存在浏览器端“键值对”
- 服务端能够向用户浏览器端写cookie
- 客户端每次方请求时,会携带cookie去
- 具体一个浏览器,针对一个服务器的存值

''' class HttpResponseBase: def set_cookie(self, key, 键 value='', 值 max_age=None, 超长时间 cookie须要延续的时间(以秒为单位) 若是参数是\ None`` ,这个cookie会延续到浏览器关闭为止。 expires=None, 超长时间 expires默认None ,cookie失效的实际日期/时间。 path='/', Cookie生效的路径, 浏览器只会把cookie回传给带有该路径的页面,这样能够避免将 cookie传给站点中的其余的应用。 / 表示根路径,特殊的:根路径的cookie能够被任何url的页面访问 domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。 如, domain=".example.com" 所构造的cookie对下面这些站点都是可读的: www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。 若是该参数设置为 None ,cookie只能由设置它的站点读取。 secure=False, 若是设置为 True ,浏览器将经过HTTPS来回传cookie。 httponly=False 只能http协议传输,没法被JavaScript获取 (不是绝对,底层抓包能够获取到也能够被覆盖) ): pass ''' 获取cookie: request.COOKIES 删除cookie:response.delete_cookie("cookie_key",path="/",domain=name)
1、django中cookie语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 设置cookie rep.set_cookie(key,value,...)
# response = HttpResponse(...) 或 response = render(request, ...) 或 response = redirect()
response
=
HttpResponse(
"登陆成功!"
)
response.set_cookie(
"is_login"
,
True
)
response.set_cookie(
"username"
, user.user, path
=
"/index/"
)
import
datetime
now
=
datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
response.set_cookie(
"last_visit_time"
, now)
# 获取cookie:
is_login
=
request.COOKIES.get(
"is_login"
)
username
=
request.COOKIES.get(
"username"
)
last_visit_time
=
request.COOKIES.get(
"last_visit_time"
, "")
# cookie签名:
# response = HttpResponse(...) 或 response = render(request, ...) 或 response = redirect()
response
=
HttpResponse(
"登陆成功!"
)
response.set_signed_cookie(
'ticket'
,
"123123"
, salt
=
'加密盐'
)
request.get_signed_cookie(
'ticket'
,salt
=
'加密盐'
)
|
Session
Session是服务器端技术,利用这个技术,服务器在运行时能够为每个用户的浏览器建立一个其独享的session对象,因为 session为用户浏览器独享,因此用户在访问服务器的web资源时 ,能够把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。python
- 保存在服务端的数据(本质是键值对)
- 敏感信息不会直接给客户端
- 依赖cookie
- 当用户来登陆的时候,服务端生成随机字符串给客户端的浏览器,浏览器写到cookie里面, 服务器端把这个随机字符串保存里面,让这个随机字符串能够对应一些值,这些值就属于用户,每一个用户就是一个随机字符串

1、设置Sessions值 request.session['session_name'] ="admin" 2、获取Sessions值 session_name = request.session["session_name"] 3、删除Sessions值 del request.session["session_name"] 4、flush() 删除当前的会话数据并删除会话的Cookie。 这用于确保前面的会话数据不能够再次被用户的浏览器访问 五、get(key, default=None) fav_color = request.session.get('fav_color', 'red') 6、pop(key) fav_color = request.session.pop('fav_color') 7、keys() 8、items() 9、setdefault() 10 用户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失效策略。
1、django中session语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
'''
#设置session
if request.COOKIE.get("sessionid"):
更新
在django—session表中建立一条记录:
session-key session-data
ltv8zy1kh5lxj1if1fcs2pqwodumr45t 更新数据
else:
1 生成随机字符串 ltv8zy1kh5lxj1if1fcs2pqwodumr45t
2 经过cookie发送给客户端 response.set_cookie("sessionid",ltv8zy1kh5lxj1if1fcs2pqwodumr45t)
3 服务端保存 在django—session表中建立一条记录:
session-key session-data
ltv8zy1kh5lxj1if1fcs2pqwodumr45t {"is_login":True,"username":"yuan"}
{
随机字符串1: {'username':'bubu','email':x''...}
}
'''
request.session[
"is_login"
]
=
True
request.session[
"username"
]
=
user.user
request.session.setdefault(
'k1'
,
123
)
# 存在则不设置
import
datetime
now
=
datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
request.session[
"last_visit_time"
]
=
now
'''
#获取session:
1 获取客户端cookie中的随机字符串 request.COOKIE.get("sessionid") # ltv8zy1kh5lxj1if1fcs2pqwodumr45t
2 去session中查找有没有随机字符 django-session表中查找记录:
session-key session-data
ltv8zy1kh5lxj1if1fcs2pqwodumr45t {"is_login":True,"username":"yuan"}
obj=django—session.objects .filter(session-key=ltv8zy1kh5lxj1if1fcs2pqwodumr45t).first()
3 去session对应key的value中查看是否有 is_login obj.session-data.get("is_login")
'''
is_login
=
request.session.get(
"is_login"
,
None
)
username
=
request.session.get(
"username"
,
None
)
last_visit_time
=
request.session.get(
"last_visit_time"
,
None
)
#其余
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串
session_key
=
request.session.session_key
'''
#删除session
1 randon_str=request.COOKIE.get("sessionid")
2 django-session.objects.filter(session-key=randon_str).delete()
3 response.delete_cookie("sessionid",randon_str)
'''
request.session.flush()
#所有删除(完成上面3步) 推荐使用
del
request.session[
'k1'
]
#删除的是随机字符串里面的k1
|
2、Django的session配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
"""
# settings.py中配置
Django默认支持Session,而且默认是将Session数据存储在数据库中,即:django_session表中。提供了5种类型的Session
"""
#1.数据库
SESSION_ENGINE
=
'django.contrib.sessions.backends.db'
# 引擎(默认)
#2.缓存
SESSION_ENGINE
=
'django.contrib.sessions.backends.cache'
# 引擎
SESSION_CACHE_ALIAS
=
'default'
# 要配合Django缓存配置
# 使用的缓存别名(默认内存缓存,也能够是memcache),此处别名依赖缓存的设置
#3.文件
SESSION_ENGINE
=
'django.contrib.sessions.backends.file'
# 引擎
SESSION_FILE_PATH
=
None
# 缓存文件路径,若是为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
#4.缓存+数据库
SESSION_ENGINE
=
'django.contrib.sessions.backends.cached_db'
# 引擎
#5.加密cookie 基本没有用
SESSION_ENGINE
=
'django.contrib.sessions.backends.signed_cookies'
# 引擎
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
=
True
# (每次刷新更新时间) 是否每次请求都保存Session,默认修改以后才保存(默认)
|
练习
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
from
django.shortcuts
import
render, HttpResponse, redirect
from
app01.models
import
UserInfo
def
login(request):
if
request.method
=
=
"POST"
:
user
=
request.POST.get(
"user"
)
pwd
=
request.POST.get(
"pwd"
)
user
=
UserInfo.objects.
filter
(user
=
user, pwd
=
pwd).first()
if
user:
#===================设置cookie===================
response
=
HttpResponse(
"登陆成功!"
)
response.set_cookie(
"is_login"
,
True
)
response.set_cookie(
"username"
, user.user, path
=
"/index/"
)
import
datetime
last_visit_time
=
datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
response.set_cookie(
"last_visit_time"
,last_visit_time)
# cookie签名:
# response.set_signed_cookie('ticket', "123123", salt='加密盐')
# request.get_signed_cookie('ticket',salt='加密盐')
#过时时间
# response.set_cookie("is_login",True,max_age=15)
# date=datetime.datetime(year=2019,month=5,day=29,hour=14,minute=34)
# response.set_cookie("username",user.user,expires=date)
return
response
#===================end 设置cookie===================
# ===================设置session===================
import
datetime
last_visit_time
=
datetime.datetime.now().strftime(
"%Y-%m-%d %H:%M:%S"
)
# request.session["is_login"] = True
# request.session["username"] = user.user
# request.session["last_visit_time"] = last_visit_time
request.session[
'user_info'
]
=
{
'is_login'
:
True
,
'username'
: user.user,
'last_visit_time'
: last_visit_time}
return
HttpResponse(
"登陆成功!"
)
# ===================end 设置session===================
return
render(request,
"login.html"
)
def
index(request):
# ===================获取cookie===================
is_login
=
request.COOKIES.get(
"is_login"
)
if
is_login:
username
=
request.COOKIES.get(
"username"
)
last_visit_time
=
request.COOKIES.get(
"last_visit_time"
, "")
return
render(request,
"index.html"
, {
"username"
: username,
"last_visit_time"
: last_visit_time})
# ===================end 获取cookie===================
# ===================获取session===================
is_login
=
request.session.get(
"user_info"
).get(
"is_login"
,
None
)
if
is_login:
username
=
request.session.get(
"user_info"
).get(
"username"
)
last_visit_time
=
request.session.get(
"user_info"
).get(
"last_visit_time"
)
return
render(request,
"index.html"
, {
"username"
: username,
"last_visit_time"
: last_visit_time})
# ===================end 获取session===================
else
:
return
redirect(
"/login/"
)
def
logout(request):
request.session.flush()
return
redirect(
"/login/"
)
|