Django内置的会话控制简称Session,可为访问者提供基础的数据存储。数据主要存储在服务器上,并且网站的任意站点都能使用会话数据。
当用户第一次访问网站时,网站的服务器将自动创建一个Session对象,该Session对象相当于该用户在网站的一个身份凭证,而且Session能存储该用户的数据信息。当用户在网站的页面之间跳转时,存储在Session对象中的数据不会丢失,只有Session过期或被清理时,服务器才将Session中存储的数据清空并终止该Session。
在创建Django项目时,Django已默认启用Session功能,Session是通过Django的中间件实现的,可以在配置文件settings.py中找到相关信息。
django中Session默认使用数据库保存相关的数据信息,如果想变更Session的保存方式,可以在settings.py中添加配置信息SESSION_ENGINE
,该配置可以指定Session的保存方式。Django提供了5种Session的保存方式:
#settings.py
#数据库保存方式,默认方式,无须在setting.py中配置
SESSION_ENGINE = ‘django.contrib.sessions.backends.db’
#以文件形式保存
SESSION_ENGINE = ‘django.contrib.sessions.backends.file’
#使用文本保存可设置文件保存路径,/mysite 代表项目根目录
SESSION_FILE_PATH = '/mysite'
#以缓存形式保存
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’
#设置缓存名,默认是内存缓存方式,此处的设置于缓存机制的设置相关
SESSION_CACHE_ALIAS = 'default'
#以数据库 + 缓存形式保存
SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db’
#以cookies形式保存
SESSION_ENGINE = ‘django.contrib.sessions.backends.signed_cookies’
SESSION_ENGINE用于配置服务器Session的保存方式,如果想要配置Cookie的Session的保存方式,可以在settings.py中添加如下表所示的配置。
配置信息 | 说明 |
---|---|
SESSION_COOKIE_NAME = 'sessionid' | 设置Cookie里Session的键,默认为sessionid |
SESSION_COOKIE_PATH = '/' | 设置Cookie里Session的保存路径,默认为‘/’ |
SESSION_COOKIE_DOMIN = None | 设置Cookie里Session的保存域名,默认为None |
SESSION_COOKIE_SECURE = False | 是否使用HTTPS传输Cookie,默认为False |
SESSION_COOKIE_HTTPONLY = True | 是否只支持HTTP传输,默认为True |
SESSION_COOKIE_AGE = 1209600 | 设置Cookie里Session的有效期,默认时间2周 |
SESSION_EXPIRE_AT_BROWSER_CLOSE = False | 是否关闭浏览器使得Session过期,默认为False |
SESSION_SAVE_EVERY_REQUEST = False | 是否每次发送后保存Session,默认为False |
Session的数据类型可理解为Python的字典类型,主要在视图函数中执行读写操作,并且从用户请求对象中获取,即来自视图函数的参数request。Session的读写如下:
#request 为视图函数的参数 request
#获取k1 的值,若 k1 不存在则会报错
request.session['k1']
#获取k1 的值,若k1 不存在则为空值
#get 和 setdefault 所实现的功能一致
request.session.get['k1', '']
request.session.setdefault('k1', '')
#设置session的值,键为k1, 值为123
request.session['k1'] = 123
#删除session中 k1 的数据
del request.session['k1']
#删除整个session
request.session.clear()
#获取session的键
request.session.keys()
#获取session的值
request.session.values()
#获取session的session_key,即数据表django_session的字段session_key
request.session.session_key
这里以一个简单的购物车功能为例来讲解如何使用Session。购物车的实现思路如下:
- 用户点击“加入购物车”按钮触发一个GET请求,并将商品信息作为请求参数传给视图函数处理
- 视图函数接收GET请求后,将请求参数保存到Session中并返回首页,即刷新当前页面
- 当用户进入购物车页面时,程序获取Session里的数据,并将数据展示在购物车列表中。
- 用户在购物车页面单击某个商品的“移除商品”按钮时,程序在Session中删除该商品信息。
我们改造mysite项目中的index 的urls.py、views.py、index.html,在templates中添加一个shoppingCar.html模板文件。
网站的首页主要实现Session的写入,购物车页面实现Session的读取和删除操作。
首先编写urls.py和views.py文件。
#index 的 urls.py
urlpatterns = [
path('', views.index, name='index'),
path('shoppingCar.html', views.shoppingCarView, name='shoppingCar'),
]
#index 的 views.py
from django.shortcuts import render,redirect
from django.contrib.auth.decorators import login_required, permission_required
#使用login_required和permission_required分别对用户登录和用户权限进行验证
@login_required(login_url='/user/login.html')
@permission_required(perm='index.visit_product', login_url='/user/login.html')
def index(request):
context = {'title':'首页'}
#获取GET请求参数
product = request.GET.get('product', '')
price = request.GET.get('price', '')
if product:
#尝试获取存储在Session中的数据,若Session不存在product_info,则返回一个空列表
product_list = request.session.get('product_info', [])
#判断当前请求参数是否已存储在Session
if not product in product_list:
#将当前参数存储在列表product_list中
product_list.append({'price':price, 'product':product})
#更新存储在Session中的数据
request.session['product_info'] = product_list
return redirect('/')
return render(request, 'index.html', context=context)
@login_required(login_url='/user/login.html')
def shoppingCarView(request):
#获取存储在Session中的数据,若Session中不存在product_info,则返回一个空列表
product_list = request.session.get('product_info', [])
#获取GET请求参数,若没有请求参数,则返回空值
del_product = request.GET.get('product', '')
#判断是否为空,若非空,则删除Session中的商品信息
if del_product:
#删除Session中某个商品数据
for i in product_list:
if i['product'] == del_product:
product_list.remove(i)
#将删除后的数据覆盖原来的Session
request.session['product_info'] = product_list
return redirect('/shoppingCar.html')
return render(request, 'shoppingCar.html', locals())
模板文件代码如下:
#index.html
{% load myfilter %}
<title>{{ title | myreplace:'首页:我的首页' }}</title>
{#在模版中使用user变量是一个User或者AnoymousUser对象,该对象由模型MyUser实例化#}
{% if user.is_authenticated %}
<div >用户名: {{ user.username }}</div>
<div><a href="{% url 'logout' %}">退出登录</a></div>
{% endif %}
<div><a href="{% url 'shoppingCar' %}">我的购物车</a></div>
<ul>
<li>手机1</li><div style="position: relative;top:-22px;left:50px"><a href="{% url 'index' %}?product=手机1&price=1999">加入购物车</a></div>
<li>手机2</li><div style="position: relative;top:-20px;left:50px"><a href="{% url 'index' %}?product=手机2&price=2999">加入购物车</a></div>
<li>手机3</li><div style="position: relative;top:-18px;left:50px"><a href="{% url 'index' %}?product=手机3&price=3999">加入购物车</a></div>
<li>手机4</li><div style="position: relative;top:-16px;left:50px"><a href="{% url 'index' %}?product=手机4&price=4999">加入购物车</a></div>
</ul>
#shoppingCar.html
<title>我的购物车</title>
<body>
<div style="float: right;"><a href="{% url 'index' %}">返回首页</a></div>
<div>
{% for info in product_list %}
<ul>
<li>
<div><a href="">{{ info.product }}</a></div>
</li>
<li>
<p>¥{{ info.price }}</p>
</li>
<li>
<p class="del">
<a href="{% url 'shoppingCar' %}?product={{ info.product }}" class="delBtn">移除商品</a>
</p>
</li>
</ul>
{% endfor %}
</div>
</div>
</body>
运行首页如下:

点击加入购物车,可以重复点击,然后再点击我的购物车。

点击移除商品可以删除掉购物车的商品。
网友评论