在应用中使用会话以改善用户体验
1 用户偏好
商户可能希望根据个人客户以前对网站的使用、偏好等为他们提供定制的体验。
例如,您可以隐藏用户在下次访问网站时先前确认的警告消息,或者存储并尊重他们的首选项(例如,他们希望在每个页面上显示的搜索结果数)。
使用会话插件允许您实现这种行为,允许您基于每个站点访问者存储和检索任意数据。
1.1 会话简介 session
我们知道HTTP是无状态的。
Web浏览器和服务器之间的所有通信意味着客户端和服务器之间的消息完全相互独立 - 没有基于先前消息的“序列”或行为的概念。
因此,如果您想拥有一个跟踪与客户持续关系的网站,您需要自己实现。
会话是大多数互联网用来跟踪站点和特定浏览器之间的“状态”的机制。
会话允许您为每个浏览器存储任意数据,并在浏览器连接时使这些数据可供站点使用。
然后,与会话关联的单个数据项由“键”引用,该键用于存储和检索数据。
Django 使用包含特殊会话 ID 的 cookie 来识别每个浏览器及其与站点的关联会话。
默认情况下,实际会话数据存储在站点数据库中,这比将数据存储在 Cookie 中更安全,因为 Cookie 中的数据更容易受到恶意用户的攻击。
你可以将 Django 配置为将会话数据存储在其他地方(缓存、文件、“安全”cookie),但默认位置应当是一个很好的且相对安全的选项。
1.2 使用会话默认内置插件
会话是在我们创建骨架网站时自动启用的。配置在项目文件的 and 部分(settings.py)中设置,如下所示:INSTALLED_APPSMIDDLEWARE
INSTALLED_APPS = [
# …
'django.contrib.sessions',
# …
MIDDLEWARE = [
# …
'django.contrib.sessions.middleware.SessionMiddleware',
# …
您可以从参数访问视图中的属性(作为第一个参数传入到视图)。
此会话属性表示与当前用户的特定连接(或者更准确地说,与当前浏览器的连接,由本网站浏览器 cookie 中的会话 ID 标识)。session request HttpRequest
该属性是一个类似字典的对象,您可以在视图中随意读取和写入它,并根据需要对其进行修改。
您可以执行所有正常的字典操作,包括清除所有数据、测试是否存在键、遍历数据等。
但大多数情况下,您只需使用标准的“字典”API 来获取和设置值。
session下面的代码片段显示了如何使用与当前会话(浏览器)关联的键 “” 获取、设置和删除某些数据。
my_name = request.session['my_name']
从会话获取名称,如果名称不存在,则返回一个默认值。
my_name = request.session.get('my_name', 'jack')
给会话的字段my_name设置一个新值
request.session['my_name'] = 'jack'
删除一个会话字段的值
del request.session['my_name']
该 API 还提供了许多其他方法,主要用于管理关联的会话 Cookie。
例如,有一些方法可以测试客户端浏览器中是否支持 Cookie,设置和检查 Cookie 到期日期,以及从数据存储中清除过期的会话。
- 保存会话数据
默认情况下,Django 只保存到会话数据库,并在会话被修改(分配)或删除时将会话 cookie发送到客户端。
如果您使用其会话密钥更新某些数据,则无需关注这一点!例如:
request.session['my_name'] = 'jack'
如果你正在更新会话数据中的一些信息,那么 Django 将无法识别你对会话进行了哪些更改并保存数据)。
在这种情况下,您需要将会话my_name显式标记为已修改。
request.session['my_car']['first_name'] = 'maa'
request.session.modified = True
注意:您可以更改行为,以便站点通过添加到您的项目设置(setting.py)中,在每个请求上更新数据库/发送 cookie。
SESSION_SAVE_EVERY_REQUEST = True
1.3 示例:页面访问次数统计
作为一个简单的实际示例,我们将更新我们的库,以告诉当前用户他们访问了 LocalLibrary 主页的次数。
打开项目应用的 /views.py,并将包含的行添加到num_visits index() (如下所示)。
def index(request):
# …
默认情况下,“all()”是隐含的。
authors_numb = Author.objects.count()
此视图的访问次数,如会话变量中计数的那样。
visit_numb = request.session.get('visit_numb', 0)
request.session['visit_numb'] = visit_numb + 1
context = {
'numb_books': numb_books,
'numb_instances': numb_instances,
'numb_instances_available': numb_instances_available,
'numb_authors': authors_numb,
'numb_visits': visit_numb,
}
返回并呈现 HTML 模板索引.html上下文变量中的数据。
return render(request, 'index.html', context=context)
在这里,我们首先获取会话密钥的值,如果之前未设置,则将值设置为 0。
每次收到请求时,我们都会递增该值并将其存储回会话中(供用户下次访问页面时使用),然后将变量传递给上下文变量中的模板。
将以下块底部显示的行添加到“动态内容”部分底部的主 HTML 模板 (index.html) 中,以显示上下文变量。
<h2>Dynamic content</h2>
<p>The library has the following record counts:</p>
<ul>
<li><strong>书籍:</strong> {{ numb_books }}</li>
<li><strong>已用:</strong> {{ numb_instances }}</li>
<li><strong>剩余:</strong> {{ numb_instances_available }}</li>
<li><strong>作者:</strong> {{ numb_authors }}</li>
</ul>
<p>
您已访问该服务 {{ numb_visits }} 次 {{ num_visits|pluralize }}.
</p>
2 总结
请注意,当页面被多次访问时,我们使用 Django 内置模板来添加到标记字段。
保存更改并重新启动服务器。每次刷新页面时,数字都应更新。
现在我们可以使用会话来改善与匿名用户的交互了。
参考
https://docs.djangoproject.com/en/4.0/topics/http/sessions/
- 点赞
- 收藏
- 关注作者
评论(0)