Django之session详解与实战示例(其他篇五)
上一篇:Django之分页(其他篇四)点击跳转
下一篇:Django之缓存六种方式及实战示例(其他篇六)点击跳转
目录
- session介绍
- Session生命周期
- Django提供了5种类型的Session
- 1、数据库Session
- 2、缓存Session
- 3、文件Session
- 4、缓存+数据库Session(数据库用于做持久化,缓存用于提高效率)
- 实战示例
- 1.创建Django项目
- 2.定义setting配置文件的静态目录路径和创建静态目录
- 3.定义请求的URL路由分发
- 4.定义url对应函数处理
- 5.定义响应的html文件
- 6.启动Django
- 7.浏览器访问URL结果
session介绍
讲到session那么我们就必须先回顾cookie,因为session是需要依赖cookie的,我们都知道如果基于cookie进行访问的话,敏感的信息就会泄露,不符合安全问题所以session就是为了解决这个问题,同时session也是提高访问性能.
Session原理:
1.Cookie是保存在用户浏览器端的键值对(就是字典)
2.Session是保存在服务器端的键值对(就是字典)
3.Session依赖于cookie
Session生命周期
1. Burgess第一次登录成功了
2.后台就把Burgess该用户的一些常用的信息存放在session(内存)如下:
session = {
#(Burgess用户)
随机生成字符串(如:aaaaa):{
‘is_login’:True,
‘user’:’Burgess’,
‘nid’:’....’,
......
}
#(Cristal用户)
随机生成字符串(如:bbbbb):{
‘is_login’:True,
‘user’:’Cristal’,
‘nid’:’....’,
.....
}
}
3.然后把随机字符串aaaaa or bbbbb给对应的用户.
4.下次登录会带着这个随机字符串aaaaa or bbbbb
5.sesstion根据这个随机字符串aaaaa or bbbbb进行匹配然后从对应的字典,在拿到相关的信息
所有用户相关的信息用户客户端的没有的,只有一个随机字符串
而服务端维护的就是用户的相关信息(就是一个大的字典,随机字符串为key)
如果你要用session来做这件事,就非常简单了
如果自己手写,就自己写个随机字符串给用户,生成字典,要把随机字符串写进用户的cookie..
但是在django已经帮你完成了所有的操作
Django提供了5种类型的Session
分别为: 数据库(默认)、 缓存、文件、缓存+数据库、加密cookie
1、数据库Session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
a. 配置 settings.py(配置一些sessiton的默认值)
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
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 = False
# 是否每次请求都保存Session,默认修改之后才保存(默认)
# 这个很重要,假如超时时间10秒session失效,其实我们每次对该页面请求或者刷新后,都应该对该超时10秒进行再次推后,也就是,超时时间根据你当前操作后的时间的10秒后才失效,如果期间又有操作,那么超时时间继续根据操作后的当前时为准
# 应该把这个设置成True
b. 使用
def index(request):
# 获取值
request.session['k1']#如果客户端的key不存在这种形式会报错
request.session.get('k1',None) #所以一般使用这种,后面设置个None默认值就不会报错
# 设置值
request.session['k1'] = 123 #设置用户相关信息
request.session.setdefault('k1',123) #存在则不设置
# 删除Session中数据
del request.session['k1'] #删除掉该key的值
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
#如for循环
for k in request.session.keys():
for v in request.session.valuess():
for k,v in request.session.items():
# 用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
#作用,默认超时时间保存2周,用户的cookie的随机字符串也是2周,如果用户清除了cookie的随机字符串,服务端还是存在该字符串,用户继续重新登录以后,服务端就出现了2个随机字符串对该用户,前面的一条随机字符串就等于是一条脏数据,如果这条脏数据放在缓存里面如(memched、redis)是没问题的,默认到了超时时间点就自动清除之前的脏数据(系统机制),而数据库就没有该机制,所以使用该命令就等于拿到了该用户所有相关信息,包括之前的随机字符串,根据随机字符串的当前时间时间和超时时间,进行判断:如果当前时间比超时时间大,清除脏数据
#检查 用户session的随机字符串 在数据库中是否存在
request.session.exists("session_key")
#删除当前用户的所有Session数据
request.session.delete("session_key")#应用场景:用户点注销的时候,就删除掉所有用户的session信息
#设置当前用户超时时间(session 和用户cookie的超时时间,默认两周)
request.session.set_expiry(value)
#* 如果value是个整数,session会在些秒数后失效。
#* 如果value是个datatime或timedelta,session就会在这个时间后失效。
#* 如果value是0,用户关闭浏览器session就会失效。
#* 如果value是None,session会依赖全局session失效策略。
2、缓存Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default'
# 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
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 = False
# 是否每次请求都保存Session,默认修改之后才保存
b. 使用
(同数据库session的使用一致)
3、文件Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None
# 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
# 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
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 = False
# 是否每次请求都保存Session,默认修改之后才保存
b. 使用
(同数据库session的使用一致)
4、缓存+数据库Session(数据库用于做持久化,缓存用于提高效率)
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
b. 使用
(同数据库session的使用一致)
5、加密cookie Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
b. 使用
(同数据库session的使用一致)
实战示例
1.创建Django项目
Django之创建项目【二】:https://blog.csdn.net/Burgess_zheng/article/details/86505526
2.定义setting配置文件的静态目录路径和创建静态目录
路径:project_burgess/project_burgess/setting
3.定义请求的URL路由分发
路径:project_burgess/project_burgess/urls.py
from django.contrib import admin from django.urls import path,re_path #Django版本2.0以上 from project_burgess import views from django.conf.urls import url #Django2.0 from django.conf.urls import include urlpatterns = [ path('admin/', admin.site.urls), #session path('login/', views.login),#最新版本的Django路由使用path #url(r'^login/', views.login), #2.0版本使用的是url path('index/', views.index),#最新版本的Django路由使用path #url(r'^index/', views.index), #2.0版本使用的是url path('logout/', views.logout), # 最新版本的Django路由使用path # url(r'^logout/', views.logout), #2.0版本使用的是url ]
4.定义url对应函数处理
路径:project_burgess/project_burgess/views.py
__author__ = "Burgess Zheng" #!/usr/bin/env python #-*- coding:utf-8 -*- from django.shortcuts import render,HttpResponse,redirect def login(request): if request.method == "GET": return render(request,'login.html',) elif request.method == "POST": user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'burgess' and pwd =="123": #如果用户登录成功基于sesstion的话就需要以下几步 #1.本地生成随机字符串 #2.随机字符串写到用户浏览器cookie #3.保存到session中 #4.在随机字符串对应的字典中,设置用户相关内容 #而django已经帮我们做了以上几个步骤(1句解决),如下: # 记住在使用session之前一定要先 makemigrations and migrate request.session['username'] = user #session设置值 request.session['is_login'] = True #session设置值 if request.POST.get('rmb',None) == '1': request.session.set_expiry(10)#设置session超时10秒钟 # request.session.set_expiry(60)#60秒后session失效 # request.session.set_expiry(60*60) # 1小时后session失效 #默认配置超时是在project/setting/里面写的的 return redirect('/index/') else: return render(request,'login.html') def index(requset): #获取当前用户cookie的随机字符串 #根据随机字符串获取相应信息 #if requset.session['is_login']: #判断该key的状态是否为true真,如果用户没有该session的key就报错,如果没有该key就设置个None if requset.session.get('is_login',None): username = requset.session['username'] return render(requset,'index.html',{'username':username}) else: return HttpResponse('无效session,请先登录') def logout(request): request.session.clear()#该用户所有相关session都清空 #del request.session['username'] #删除该用户相关session指定的信息 return redirect('/login/')
5.定义响应的html文件
涉及到csrf跳转:Django之CSRF XSS原理解析【交互篇四】 https://blog.csdn.net/Burgess_zheng/article/details/86548425
路径:project_burgess/templates/login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="POST"> {% csrf_token %} <input type="text" name="user" /> <input type="password" name="pwd" /> <input type="checkbox" name="rmb" value="1"/>10秒免登陆 <input type="submit" value="提交" /> </form> </body> </html>
路径:project_burgess/templates/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>欢迎登录:{{ username }},{{ request.session.username }}</h1> {#可以使用模板渲染,也可以使用request,本身session信息就在request里面#} <a href="/logout/">注销</a> </body> </html>
6.启动Django
手动:python manage.py runserver 127.0.0.1:8000
pycharm:
7.浏览器访问URL结果
get请求index
get请求login
点击提交
新标签访问index
点击注销
10秒免登录
10秒后
注意:其实每次刷新应该在刷新的时间重新计算失效时间:
参数设置:SESSION_SAVE_EVERY_REQUEST = True
当然还有其他需求可以根据相关参数进行需求调整,参数在上面已经写了
上一篇:Django之分页(其他篇四)点击跳转
下一篇:Django之缓存六种方式及实战示例(其他篇六)点击跳转