05-session-会话跟踪技术
1、session简介
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享的session对象,
由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各自的数据放在各自的session中,
当用户再去访问该服务器中的其它web资源时,其它web资源再从用户各自的session中 取出数据为用户服务。
2、session之保存登录状态信息
1、写session
2、session读取
3、不同浏览器,会创建不同的session_id
4、views视图代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def login_session(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") # user_obj = UserInfo.objects.filter(username=user, password=pwd) # AttributeError: 'QuerySet' object has no attribute 'username' user_obj = UserInfo.objects.filter(username=user, password=pwd).first() if user_obj: # 设置session request.session['is_login'] = True request.session['username'] = user_obj.username """ 设置session步骤 1.生成随机字符串 q4r5q4rfar32543 2.response.set_cookie("session_id",q4r5q4rfar32543) 3.在django-session表创建一条记录: session-key session-data q4r5q4rfar32543 {"is_login":True, "username":"alex"} """ return HttpResponse("登录成功") return render(request, 'login_session.html') def index_session(request): # 获取session is_login = request.session.get("is_login") print("is_login:", is_login) # True if not is_login: return redirect("/login_session/") username = request.session.get("username") """ 获取session流程 1 request.COOKIE.get("session") # wspn39juwcrrqxs0916ftmlcvyl7c1gg 2 django-session表中过滤记录: 在django-session表中创建一条记录: session-key session-data wspn39juwcrrqxs0916ftmlcvyl7c1gg {"is_login":True, "username":"alex"} obj = django-session.object.filter(session-key=wspn39juwcrrqxs0916ftmlcvyl7c1gg) 3 obj.session-data.get("is_login") """ return render(request, "index_session.html", {"username": username})
4、session应用之保存上次登录时间
5、前部分session代码
modles
from django.db import models class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32)
主url
from django.contrib import admin from django.urls import path, re_path, include urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^', include(('app01.urls', 'app01'))) ]
url
from django.urls import path, re_path, include from app01 import views urlpatterns = [ re_path(r'^login_session/$', views.login_session, name='login_session'), re_path(r'^index_session/$', views.index_session, name='index_session'), ]
views
from django.shortcuts import render, HttpResponse, redirect from app01.models import UserInfo def login_session(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") user_obj = UserInfo.objects.filter(username=user, password=pwd).first() if user_obj: # 设置session request.session['is_login'] = True request.session['username'] = user_obj.username return HttpResponse("登录成功") return render(request, 'login_session.html') def index_session(request): # 获取session is_login = request.session.get("is_login") print("is_login:", is_login) # True if not is_login: return redirect("/login_session/") username = request.session.get("username") last_visit_time = request.session.get("last_visit_time", "") # get到last_time response = render(request, "index_session.html", {"username": username, "last_visit_time": last_visit_time}) import datetime now = datetime.datetime.now().strftime("%Y-%m-%d %X") request.session["last_visit_time"] = now # 设置时间 return response
模板层
login_session.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} username <input type="text" name="user"> password <input type="password" name="pwd"> <input type="submit" value="登录"> </form> </body> </html>
index_session.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>hi {{ username }}</h3> <p>上次登录时间:{{ last_visit_time }}</p> </body> </html>
5、session的更新操作
同一个浏览器,后面的session_data 会覆盖前面的数据
6、基于session的注销功能
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()
logout视图
def logout(request): # 删除session值 del request.session["is_login"] del request.session["username"] # 删除全部数据 request.session.flush() """ 删除session流程 1 random_str = request.COOKIE.get("sessionid") 2 django-session.objects.filter(session-key=random_str).delete() 3 response.delete_cookie("sessionid", random_str) """ return redirect("/login_session/")
index_seeion.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>hi {{ username }}</h3> <p>上次登录时间:{{ last_visit_time }}</p> <a href="/logout/">注销</a> </body> </html>
7、session的配置参数
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,默认修改之后才保存
session失效时间15s
每次访问刷新15s
SESSION_COOKIE_NAME = "yuan" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_AGE = 15 # Session的cookie失效日期 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = True # 是否每次请求都保存Session,默认修改之后才保存
8、session练习
1 登录案例
需要的页面: #login.html:登录页面,提供登录表单; #index1.html:主页,显示当前用户名称,如果没有登录,显示您还没登录; #index2.html:主页,显示当前用户名称,如果没有登录,显示您还没登录;
思考,如果第二个人再次再同一个浏览器上登录,django-session表会怎样?
2 验证码案例
验证码可以去识别发出请求的是人还是程序!当然,如果聪明的程序可以去分析验证码图片!但分析图片也不是一件容易的事,因为一般验证码图片都会带有干扰线,人都看不清,那么程序一定分析不出来。
PIL 模块
9、cookie与 session总结
# cookie总结 1 response.set_cookie(key,value) 2 request.COOKIE.get(key)
# sessiono总结 3 request.session[key] = value # 写session 注意django对应操作 ''' if request.COOKIE.get("session_id") wspn39juwcrrqxs091 更新 在django-session表中创建一条记录: session-key session-data wspn39juwcrrqxs0916ftmlcvyl7c1gg 更新数据 else: 1.生成随机字符串 q4r5q4rfar32543 2.response.set_cookie("session_id",q4r5q4rfar32543) 3.在django-session表创建一条记录: session-key session-data q4r5q4rfar32543 {"is_login":True, "username":"alex" ''' 4 request.session[key] # 读session ''' 1 request.COOKIE.get("session") # wspn39juwcrrqxs0916ftmlcvyl7c1gg 2 django-session表中过滤记录: 在django-session表中创建一条记录: session-key session-data wspn39juwcrrqxs0916ftmlcvyl7c1gg {"is_login":True, "username":"alex" obj = django-session.object.filter(session-key=wspn39juwcrrqxs0916ftmlcvyl7 3 obj.session-data.get("is_login") ''' 5. request.session.flush() # 删除session """ 1 random_str = request.COOKIE.get("sessionid") 2 django-session.objects.filter(session-key=random_str).delete() 3 response.delete_cookie("sessionid", random_str) """