Django目录://www.greatytc.com/p/dc36f62b3dc5
session概述
如果说cookie是令牌的话,那么session就是虎符。持有令牌的人可以访问属于自己的资源,但是别人知道他令牌的样子的话,就可以自己伪造令牌来。如果使用session,虎符的一部分在用户手里,另一部分在服务端手里,用户拿着自己的虎符来,也必须和服务器内的另一半虎符配对才算成功。
什么是session
Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。
实例1
使用session完成登录验证
cooksessDemo.cooksessDemo.urls.py
---------------------------
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('login_session/', views.login_session),
path('index_session/', views.index_session)
]
cooksessDemo.app01.views.py
---------------------------
from django.shortcuts import render,redirect,HttpResponse
# Create your views here.
def login_session(request):
if request.method == "GET":
return render(request,"login.html")
else:
user = request.POST.get('uer')
pwd = request.POST.get('pwd')
print(user,pwd)
user_obj = Userinfo.objects.filter(user=user,pwd=pwd)
if user_obj:
#设置session
request.session['username']=user
request.session['is_login']=True
'''
1.生成一个随机字符串作为key值
g2l4frwf0bk3ggqtqp5tfs3t7jf4kodt
2.向django_session表插入一条数据:
session_key session_data
g2l4frwf0bk3ggqtqp5tfs3t7jf4kodt {"username":"alex","is_login":True}
3.响应set_cookie {"sessionid":g2l4frwf0bk3ggqtqp5tfs3t7jf4kodt}
'''
return redirect('/index_session/')
else:
return HttpResponse('error')
def index_session(request):
is_login = request.session.get('is_login')
#响应session
'''
1.request.COOKIE.get('sessionid') 既g2l4frwf0bk3ggqtqp5tfs3t7jf4kodt
2.在django_session表查找session_key
3.取出对应的session_data反序列化为字典。{"username":"alex","is_login":True}
'''
if not is_login:
return redirect('/login_session/')
user = request.session.get('username')
shangpin = "香蕉"
shangpin_list = ["苹果","荔枝","榴莲"]
name = user
return render(request,"index.html",{'name':name,"shangpin":shangpin,"shangpin_list":shangpin_list})
我们访问登录页面,之后完成登录操作。
我们可以在network当中,看到我们传递的session和value。
同时django_session内也增加了一条数据。
实例2
用户注销
cooksessDemo.cooksessDemo.urls.py
---------------------------
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('login_session/', views.login_session),
path('index_session/', views.index_session),
path('logout/',views.logout)
]
cooksessDemo.app01.views.py
---------------------------
from django.shortcuts import render,redirect,HttpResponse
# Create your views here.
def login_session(request):
if request.method == "GET":
return render(request,"login.html")
else:
user = request.POST.get('uer')
pwd = request.POST.get('pwd')
print(user,pwd)
user_obj = Userinfo.objects.filter(user=user,pwd=pwd)
if user_obj:
#设置session
request.session['username']=user
request.session['is_login']=True
'''
1.生成一个随机字符串作为key值
g2l4frwf0bk3ggqtqp5tfs3t7jf4kodt
2.向django_session表插入一条数据:
session_key session_data
g2l4frwf0bk3ggqtqp5tfs3t7jf4kodt {"username":"alex","is_login":True}
3.响应set_cookie {"sessionid":g2l4frwf0bk3ggqtqp5tfs3t7jf4kodt}
'''
return redirect('/index_session/')
else:
return HttpResponse('error')
def index_session(request):
is_login = request.session.get('is_login')
#响应session
'''
1.request.COOKIE.get('sessionid') 既g2l4frwf0bk3ggqtqp5tfs3t7jf4kodt
2.在django_session表查找session_key
3.取出对应的session_data反序列化为字典。{"username":"alex","is_login":True}
'''
if not is_login:
return redirect('/login_session/')
user = request.session.get('username')
shangpin = "香蕉"
shangpin_list = ["苹果","荔枝","榴莲"]
name = user
return render(request,"index.html",{'name':name,"shangpin":shangpin,"shangpin_list":shangpin_list})
def logout(request):
'''
1.request.COOKIE.get('sessionid')
2.在django_session表中查找并删除这条记录
3.response.delete_cookie('sessionid')
4.跳转到登录页面
'''
request.session.flush()
return redirect('/login_session/')
cooksessDemo.templates.index.html
----------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<p>用户名:{{ name }} <a href="/logout/">注销</a></p>
<p>{{ shangpin }}</p>
<p>{{ shangpin_list }}</p>
</body>
</html>
思考点:我们一个用户登录一次就会留下一条session,这样如果我们我们用户登录频繁,而且用户基数够多的话,会导致django_session表很臃肿,所以django有一个自带的机制:
一个终端(一个浏览器)只能保存一个用户的session。
例如我用谷歌浏览器登录alex账号,然后数据库截图如下:
现在我在用hanxuan账号登录
session_key没有发生改变,但是session_data发生了改变。
现在我换搜狗浏览器登录hanxuan
更换客户端后,用户的session并没有重置。也就是搜狗浏览器也保存了一个cookie。
这就是django的机制:
用户登入,首先判断用户是否携带cookie。
- 如果携带
获取用户的cookie中的sessionid。
在数据库中匹配,修改对应session_key。 - 如果没有携带
走正常流程。
他只会根据用户有没有携带cookie来进行判断,如果一个用户天天换浏览器登录我们也只能优化session表。
Django中session的语法
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。
这用于确保前面的会话数据不可以再次被用户的浏览器访问
5、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失效策略。
Django中session的配置
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
配置 settings.py
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,默认修改之后才保存(默认)