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