Session简介
1. cookie引入session:
cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患。
2. cookie+session
把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串)
基于以上原因:cookie+session组合就此作古了,还是单单使用cookie做会话保持的方式,用来存储非敏感信息;
3. cookie+session的工作流程:
(1)、当用户来访问服务端时,服务端生成一个随机字符串;
(2)、当用户登录成功后,把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;
(3)、服务器已发送给客户端,cookie中的随机字符串做键,用户信息做值,保存用户信息;
4. 保存在服务端session数据格式
session_key SessionStore()
{
session_key 数据字典
sessionid1: {id:1,nam:"alex",account:1000000000 },
sessionid2: {id:1,nam:"eric",account:10}
}
5、 Session存储引擎
#settings.py文件中
#Session默认存储在数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
#内存
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# 可以存储自定义对象,内存不用json序列化
# 服务器重启,数据丢失
#内存+数据库(双缓存)
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
# 内存速度快,数据库慢
# 储存的步骤,先存到内存,在存到数据库
# 先从内存读,再从数据库读,如果从数据库读到了,再放入内存
#file
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = os.getcwd()
#signed_cookies
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
# 将数据加密,存到cookie中了(存到浏览器)
准备工作
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cookie',
'session',
]urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^cookie/', include('cookie.urls')),
url(r'^session/', include('session.urls')),
]from django.conf.urls import url, include
import views
urlpatterns = [
url(r'^test1/', views.session_set1),
]Views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def session_set1(request):
# SessionStore()
# 设置session数据
request.session['user']='zhangsn'
# 设置过期时间(单位秒)
# request.session.set_expiry(10*60)
# 删除当前user对应的session数据(不清空数据库,也不清除cookie中的sessionid,只删除内存中的数据)
# del request.session['user']
# request.session.clear()
# 清空数据库中的session数据(清空数据库,清除cookie中的sessionid,删除内存中的数据)
request.session.flush()
# 获取sessionid
# print request.session.session_key
return HttpResponse('保存成功!')
启动服务器,会出现下列错误

由于没有models对象,所以直接执行命令就可以解决问题
python manage.py migrate
浏览器输入URL测试
http://127.0.0.1:8000/session/test1/

我们来查看下浏览器中cookie是否有sessionid的值

图解cookie+session的工作流程:

相关代码
urlpatterns = [
url(r'^test1/', views.session_set1),
url(r'^test2/', views.session_get1),
]# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
def session_set1(request):
# SessionStore()
# 设置session数据
request.session['user']='zhangsn'
# 设置过期时间(单位秒)
# request.session.set_expiry(10*60)
# 删除当前user对应的session数据(不清空数据库,也不清除cookie中的sessionid,只删除内存中的数据)
# del request.session['user']
# request.session.clear()
# 清空数据库中的session数据(清空数据库,清除cookie中的sessionid,删除内存中的数据)
request.session.flush()
# 获取sessionid
# print request.session.session_key
return HttpResponse('保存成功!')
def session_get1(request):
# session中取值
user = request.session['user']
# user = request.session.get('user')
return HttpResponse('datas:%s' % user)Session应用
相关代码
urlpatterns = [
url(r'^test1/', views.session_set1),
url(r'^test2/', views.session_get1),
url(r'^sessionlogin/$', views.sessionlogin_view),
url(r'^usercenter/$', views.center_view),
]class User(object):
def __init__(self, uname, pwd):
self.uname = uname
self.pwd = pwd
import jsonpickle
def sessionlogin_view(request):
if request.method == 'GET':
return render(request,'login_session.html')
else:
uname = request.POST.get('uname', '')
pwd = request.POST.get('pwd', '')
if uname == 'zhangsan' and pwd == '123':
user = User(uname, pwd)
request.session['user'] = jsonpickle.dumps(user)
# request.session['user'] = jsonpickle.encode(user)
return HttpResponseRedirect('/session/usercenter/')
return HttpResponse('登录失败')
def center_view(request):
user = jsonpickle.loads(request.session['user'])
# user = jsonpickle.decode(request.session['user'])
return HttpResponse('欢迎%s登录成功,密码:%s!' % (user.uname,user.pwd))
输入http://127.0.0.1:8000/session/sessionlogin/
测试结果如下

Jsonpickle序列化与反序列化
urlpatterns = [
url(r'^test1/', views.session_set1),
url(r'^test2/', views.session_get1),
url(r'^sessionlogin/$', views.sessionlogin_view),
url(r'^usercenter/$', views.center_view),
url(r'^jsonpickle_session_set/$', views.jsonpickle_session_set),
url(r'^jsonpickle_session_get/$', views.jsonpickle_session_get),
]
class Tea(object):
def __init__(self, tname, pwd):
self.tname = tname
self.pwd = pwd
def __getstate__(self):
data = self.__dict__.copy()
del data['pwd']
return data
def jsonpickle_session_set(request):
if request.method == 'GET':
return render(request, 'jsonpickle_login.html')
else:
tname = request.POST.get('tname', '')
pwd = request.POST.get('pwd', '')
if tname == 'zhangsan' and pwd == '123':
tea = Tea(tname, pwd)
# {"pwd": "123", "py/object": "session.views.Tea", "tname": "zhangsan"}
# ustr = jsonpickle.encode(user)
# {"pwd": "123", "py/object": "session.views.Tea", "tname": "zhangsan"}
tstr = jsonpickle.dumps(tea)
print tstr
request.session['tea'] = tstr
return HttpResponse('jsonpickle序列化成功')
return HttpResponse('jsonpickle序列化失败')
def jsonpickle_session_get(request):
tea = request.session.get('tea', '')
# <demo5.views.User object at 0x0000000003D48588>
# uuser = jsonpickle.decode(user)
# <demo5.views.User object at 0x0000000003D1A0F0>
ttea = jsonpickle.loads(tea)
print ttea
return HttpResponse('Tea:%s' % (ttea.tname))
# return HttpResponse('Tea:%s:%s' % (ttea.tname, ttea.pwd))

over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有