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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
注册配置 MSE Nacos/ZooKeeper,118元/月
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 【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/
目录
相关文章
|
3月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
118 1
|
3月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
222 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
3月前
|
监控 应用服务中间件 网络安全
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
部署Django应用:使用Gunicorn和Nginx构建高效的生产环境
232 0
|
3月前
|
存储 开发框架 JSON
【查漏补缺】Django模型字段类型及其应用
【查漏补缺】Django模型字段类型及其应用
35 0
|
3月前
|
存储 安全 UED
GitHub OAuth认证的Django应用
GitHub OAuth认证的Django应用
39 0
|
5月前
|
中间件 数据库连接 UED
Django中间件秘籍:如何用几行代码让你的应用变得超级强大?
【8月更文挑战第31天】中间件是Django框架的核心特性,位于视图与HTTP服务器之间,允许全局处理请求和响应,增强Web应用功能。通过实现`MiddlewareMixin`类的方法,如`process_request`和`process_response`,可以轻松实现请求预处理或响应后处理。中间件应用场景广泛,包括用户认证、CSRF防护和数据库连接管理等。创建并配置中间件需将其加入`settings.py`的`MIDDLEWARE`列表,顺序决定执行优先级。合理利用中间件能提高代码重用性和应用性能,带来更好的用户体验。
66 0
|
5月前
|
存储 缓存 数据管理
Django后端架构开发:后台管理与会话技术详解
Django后端架构开发:后台管理与会话技术详解
82 0
|
5月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
6月前
|
前端开发 JavaScript API
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
【7月更文挑战第17天】现代Web开发趋势中,前后端分离配合WebSocket满足实时通信需求。Django Channels扩展了Django,支持WebSocket连接和异步功能。通过安装Channels、配置设置、定义路由和消费者,能在Django中实现WebSocket交互。前端使用WebSocket API连接后端,实现双向数据流,如在线聊天功能。集成Channels提升Web应用的实时性和用户体验,适应实时交互场景的需求。**
248 6
|
6月前
|
安全 开发者 Python
告别迷茫,Django/Flask深入应用指南,让你的Web梦想照进现实!
【7月更文挑战第13天】在Python Web开发中,Django和Flask框架各具特色。Django适合快速构建企业级应用,提供ORM、模板引擎等全面功能;而Flask轻量灵活,适用于小项目和原型开发。通过实例,了解如何启动Django和Flask的基本应用,从创建项目到运行服务器。选择框架应考虑项目需求和个人偏好,不断学习与实践将助你实现Web梦想。
58 1

热门文章

最新文章