首页 > 技术文章 > 使用Django设置Session

Minlwen 2019-03-07 11:51 原文

Session就是保存了会话里面的数据,通过request.session进行获取

# 首页
def welcome(request):
se = request.session
print(se)
login_user_name = se.get('login_user_name')
# login_user_name = se['login_user_name'] # 有KeyErrors错误
return render(request, "welcome.html", {'login_user_name': login_user_name})

# 登录页面
def login(request):

return render(request, "login.html")

# 登录的业务逻辑
def do_login(request):
# 获取登录用户名、密码
userName = request.POST.get('userName')
# 基本参数校验

# 数据库进行匹配

# 验证数据库是否存在

# 存在就将用户名写入session
request.session['login_user_name'] = userName
return redirect("/user/welcome")

# 注销逻辑
def logout(request):
# 把userName从当前的session移除
# del request.session['login_user_name']
request.session.flush()

return redirect("/user/welcome")


Session和Cookie的关系是什么?
Session是基于Cookie, 是因为把数据写入session时将会生成一个随机字符串,
并将随机字符串存入cookie,再读取时,是先从cookie中获取这个随机字符串,在去获取session内容
在SessionMiddleware中的process_request方法里面可以看到

Session的配置:

# 使用的缓存别名(默认内存缓存)
SESSION_CACHE_ALIAS = 'default'

SESSION_COOKIE_AGE = 1209600 # 默认两周单位秒
SESSION_COOKIE_DOMAIN = None # session cookie域名 默认没有设置就是当前域名
SESSION_COOKIE_HTTPONLY = True # 设置session cookie是httponly
SESSION_COOKIE_NAME = 'sessionId' # session cookie的名字
SESSION_COOKIE_PATH = '/' # session cookie的path
SESSION_COOKIE_SECURE = False # session cookie的secure
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # session存贮位置默认db
# 'django.contrib.sessions.backends.db'
# 'django.contrib.sessions.backends.file'
# 'django.contrib.sessions.backends.cache'
# 'django.contrib.sessions.backends.cached_db'
# 'django.contrib.sessions.backends.signed_cookies'
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 浏览器关闭后是否过期session,默认是False
SESSION_FILE_PATH = None #默认没有,就是选择session存储是file时设置的存储位置
# 浏览器刷新时session是否重新计算过期时间,
# 比如设置10分钟过期,那如果为True,每次刷新session都是重新计算时间,
# 如果为False就是10分钟后就过期不管你刷不刷新
SESSION_SAVE_EVERY_REQUEST = False
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer' # session序列化类型
# 'django.contrib.sessions.serializers.PickleSerializer'
# 'django.contrib.sessions.serializers.JSONSerializer'


Session中的操作方法:
1、获取 request.session.get(key)或者是request.session[key]
2、写入request.session[key] = value
3、删 del request.session[key]
4、删除当前session request.session.flush()

Session的过期时间设置:
方法是set_expiry(value)
1.如果value=0那么浏览器关闭时,session会过期
2.如果value=datetime或者timedelta就是设置到什么时间点过期,必须要在settins.py中设置SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
3.如果value=None,跟全局的settings.py中的SESSION_COOKIE_AGE决定

Session存入的值是一个Base64加密的串,可以进行解密
MD5:不可逆加密
暴力破解,匹配

session和cookie的区别
a) 存放位置:session存放于服务器,cookie存放在客户端;
b) 安全性:cookie不安全,session安全,因此session在服务端,cookie在客户端;
c) 大小限制:cookie会由客户端浏览器控制,单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。而session在在服务端,理论上没有大小限制。
d) 系统性能影响:session存在服务端,当session比较多的情况下,服务端会受其影响,而cookie在客户端,不会影响服务器性能。

 

推荐阅读