1 概念

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。

Session:

  • 服务器端会话技术
  • 数据存储在服务器中
  • 默认Session存储在内存中
  • Django中默认会把Session持久化到数据库中
  • Django中Session的默认过期时间为14天
  • 主键是字符串
  • 存储的数据使用了数据安全:(1)使用了Base64(2)在前部添加了一个混淆串
  • Session依赖于Cookie

1.1 Django中启用Session

Session是服务器端会话技术,依赖于Cookie

Django中启用Session:
(1)在settings中

INSTALLED_APPS = [
    'django.contrib.sessions'
]

MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
]

每个HttpRequest对象都有一个session属性,也是一个类字典对象。

常用操作

方法 说明
get(key,default=None) 根据键获取会话的值
clear() 清除所有会话
flush() 删除当前的会话数据,并删除会话Cookie
delete request['session_id'] 删除会话
session.session_key 获取session的key
request.session['user']=username 设置Session,数据存储到数据库中会使用编码Base64

2 Django-Session机制

详细机制请查看Session机制详解一文。

Session持久化到数据库是为了解决多个服务器之间的数据共享问题。

Django将Session存储到数据库表名为django_session的表中。

session_data进行Base64解码

可以看到数据格式为:混淆串+数据

2.1 Session依赖于Cookie

查看开发者工具,可以看到Cookie中有sessionidsessionid对应数据库表中的session_key。

当清空Cookie后,Session中的数据就变成了脏数据

2.2 Session运行机制图

3 Django-用例

需求:使用session编写用户登录操作。

(1)urls配置

# 根路由
urlpatterns = [
    url(r'^helloSession/',include('helloSession.urls',namespace='helloSession'))
]

# 子路由
urlpatterns = [
    url(r'^login/',views.login,name='login'),		# 登录页面
    url(r'^mine/', views.mine, name='mine'),		# 个人主页 
]

(2)视图函数

GET和POST写在一个函数里边,体现了程序的高内聚

from django.http import HttpResponse
from django.shortcuts import render, redirect


# Create your views here.
from django.urls import reverse


def login(request):

    if request.method == 'GET':
        return render(request,template_name='login3.html')

    elif request.method == 'POST':
        username = request.POST.get('username')

        request.session['username'] = username      # 设置session
        response = redirect(reverse('helloSession:mine'))

        return response

def mine(request):

    username = request.session.get('username')      # 获取session
    return HttpResponse(username)

(3)模板

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="{% url 'helloSession:login' %}" method="post">
    <span>账号:</span><input type="text" placeholder="请输入账号:" name="username">

    <button>登录</button>

</form>

</body>
</html>

(4)访问


需求:使用Session怎么做退出用户操作。

方案
(1)删除cookie

def logout(request):
	# 利用response删除
    response = redirect(reverse('helloCookie:login'))
    response.delete_cookie('username')
    return response

(2)删除Session

def logout(request):
	# 跳转到登录页面
	response = redirect(reverse('helloCookie:login'))
    del request.session['username']
    return response

(3)Cookie、Session一起删除。(推荐使用,不会留下垃圾数据)

def logout(request):
	# 跳转到登录页面
	response = redirect(reverse('helloCookie:login'))
    request.session.flush()
    return response