在django应用中使用会话提示用户体验

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
可观测监控 Prometheus 版,每月50GB免费额度
云原生网关 MSE Higress,422元/月
简介: 【6月更文挑战第12天】该文档介绍了Django中如何利用会话(session)为用户提供定制体验。通过会话,开发者能更好地管理和个性化匿名用户的网站体验。参考[Django官方文档](https://docs.djangoproject.com/en/4.0/top

简介

会话用于跟踪HTTP无状态的Web浏览器和服务器之间的交互,存储每个浏览器的任意数据,并在连接时访问。

Django支持通过cookie中的会话ID识别用户会话,数据默认存储在数据库中。

在视图中,可以通过request.session访问和修改会话数据。

一个示例展示了如何统计用户访问页面的次数,每次请求时增加会话变量并保存到数据库。

1 场景:用户偏好

商户可能希望根据个人客户以前对网站的使用、偏好等为他们提供定制的体验。

例如,您可以隐藏用户在下次访问网站时先前确认的警告消息,或者存储并尊重他们的首选项(例如,他们希望在每个页面上显示的搜索结果数)。

使用会话插件允许您实现这种行为,允许您基于每个站点访问者存储和检索任意数据。

2 会话简介 session

我们知道HTTP是无状态的。

Web浏览器和服务器之间的所有通信意味着客户端和服务器之间的消息完全相互独立 - 没有基于先前消息的“序列”或行为的概念。

因此,如果您想拥有一个跟踪与客户持续关系的网站,您需要自己实现。

会话是大多数互联网用来跟踪站点和特定浏览器之间的“状态”的机制。

会话允许您为每个浏览器存储任意数据,并在浏览器连接时使这些数据可供站点使用。

然后,与会话关联的单个数据项由“键”引用,该键用于存储和检索数据。

Django 使用包含特殊会话 ID 的 cookie 来识别每个浏览器及其与站点的关联会话。

默认情况下,实际会话数据存储在站点数据库中,这比将数据存储在 Cookie 中更安全,因为 Cookie 中的数据更容易受到恶意用户的攻击。

你可以将 Django 配置为将会话数据存储在其他地方(缓存、文件、“安全”cookie),但默认位置应当是一个很好的且相对安全的选项。

3 使用会话默认内置插件

会话是在我们创建骨架网站时自动启用的。配置在项目文件的 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

4 示例:页面访问次数统计

作为一个简单的实际示例,我们将更新我们的库,以告诉当前用户他们访问了 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>

5 总结

请注意,当页面被多次访问时,我们使用 Django 内置模板来添加到标记字段。

保存更改并重新启动服务器。每次刷新页面时,数字都应更新。
现在我们可以使用会话来改善与匿名用户的交互了。

参考

https://docs.djangoproject.com/en/4.0/topics/http/sessions/
目录
相关文章
|
8天前
|
前端开发 JavaScript API
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
【7月更文挑战第17天】现代Web开发趋势中,前后端分离配合WebSocket满足实时通信需求。Django Channels扩展了Django,支持WebSocket连接和异步功能。通过安装Channels、配置设置、定义路由和消费者,能在Django中实现WebSocket交互。前端使用WebSocket API连接后端,实现双向数据流,如在线聊天功能。集成Channels提升Web应用的实时性和用户体验,适应实时交互场景的需求。**
33 6
|
12天前
|
安全 开发者 Python
告别迷茫,Django/Flask深入应用指南,让你的Web梦想照进现实!
【7月更文挑战第13天】在Python Web开发中,Django和Flask框架各具特色。Django适合快速构建企业级应用,提供ORM、模板引擎等全面功能;而Flask轻量灵活,适用于小项目和原型开发。通过实例,了解如何启动Django和Flask的基本应用,从创建项目到运行服务器。选择框架应考虑项目需求和个人偏好,不断学习与实践将助你实现Web梦想。
|
1月前
|
API 数据安全/隐私保护 网络架构
在django3中配置应用的权限
【6月更文挑战第9天】该文档介绍了Django REST Framework的权限管理。总结来说,本文介绍如何设置严格项目权限和如何通过自定义权限控制对特定资源的访问。
36 10
在django3中配置应用的权限
|
1月前
|
存储 JSON API
在django3应用中使用现代的JWT鉴权
【6月更文挑战第8天】本文介绍流行的鉴权方式,JSON Web Tokens (JWT) 是一种验证JSON数据所有者的机制,它是一个编码的、安全的字符串,包含可信任的数据且能加密签名。无状态的令牌认证允许客户端存储令牌并将其在每次请求。
33 8
在django3应用中使用现代的JWT鉴权
|
1月前
|
存储 安全 API
在django中创建项目时应用基础鉴权
【6月更文挑战第7天】本文探讨了在django中的API权限管理,即用户认证的两种方法:基础认证和会话认证。Django REST Framework默认使用会话认证,但也提供基础、令牌和JWT等其他选项。根据项目需求,应谨慎选择适合的认证方案。
67 3
在django中创建项目时应用基础鉴权
|
1月前
|
前端开发 JavaScript Linux
分离前后端react和django3构建的应用
【6月更文挑战第4天】在本文中,我们介绍了如何设置React前端并连接到Django后端。并讨论了前后端分离的好处,并计划扩展API以支持更多HTTP操作和用户身份验证功能。
61 5
分离前后端react和django3构建的应用
|
27天前
|
存储 前端开发 JavaScript
探索Django:打造高效、可扩展的Web应用(中)
探索Django:打造高效、可扩展的Web应用(中)
23 1
|
1月前
|
安全 API 数据安全/隐私保护
在django应用中使用权限控制
【6月更文挑战第6天】本文介绍在Django REST Framework中,项目权限通过默认设置如AllowAny、IsAuthenticated等管理。通过定制权限策略,确保了API的安全访问。
77 1
在django应用中使用权限控制
|
29天前
|
中间件 开发者 C++
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
|
29天前
|
前端开发 Python
Django框架中Ajax GET与POST请求的实战应用
Django框架中Ajax GET与POST请求的实战应用