Python编程:从入门到实践
章节

第 19 章 用户账户

应用真正开始面对‘谁在使用它’这个问题

这一章把用户注册、登录、注销和权限边界引入 Django 项目,让应用开始具有用户维度。

章节主张

一旦程序需要识别不同用户,应用设计就从单机逻辑升级为身份、会话和权限管理问题。

中文释读

做账户系统时,你会第一次非常明确地感受到:程序不再只是功能逻辑,而要处理身份、隔离、归属和安全边界。作者通过 Learning Log 项目把这些能力一点点引进来,使初学者不至于被认证系统的抽象吓住。真正值得抓的是一种转变:你的程序开始服务不同的人,而且要知道该把什么给谁看。

本章知识路线

  1. 一旦有用户,程序就必须处理归属和边界
  2. 会话意识是在理解‘这个用户现在正处于什么状态’

关键论点

  • 用户系统会显著抬高应用的状态复杂度。
  • 登录、注销和权限控制是 Web 应用的基础能力。
  • 对象所有权意识会改变你设计数据模型的方式。

行动清单

  • 理解用户、会话和对象归属的关系。
  • 别把认证功能仅看成模板按钮,而要看成边界管理。
  • 测试未登录、已登录和错误访问三种路径。

源章节深读

第 19 章 ⽤户账户 Web 应⽤程序的核⼼是让任何地⽅的任何⽤户都能够注册账户并使⽤ 它。本章将创建⼀些表单,让⽤户能够添加主题和条⽬并编辑既有的 条⽬。你将了解到, Django 能够防范对基于表单的⽹⻚发起的常⻅攻 击,让你⽆须花⼤量时间考虑应⽤程序的安全问题。 本章还将实现⽤户⾝份验证系统。我们将创建⼀个注册⻚⾯,供⽤户创建 ⾃⼰的账户,并让⼀些⻚⾯仅供已登录的⽤户访问。然后修改⼀些视图函 数,使⽤户只能看到⾃⼰的数据。我们还将学习如何确保⽤户数据的安 全。 19.1 让⽤户能够输⼊数据 在建⽴⽤于创建⽤户账户的⾝份验证系统之前,我们添加⼏个⻚⾯,让⽤ 户能够输⼊数据。⽤户将能够添加新主题,添加新条⽬,以及编辑既有的 条⽬。 当前,只有超级⽤户能够通过管理⽹站输⼊数据。我们不想让⽤户与管理 ⽹站交互,因此将使⽤ Django 的表单创建⼯具来创建让⽤户能够输⼊数据 的⻚⾯。 19.1.1 添加新主题 我们⾸先让⽤户能够添加新主题。在创建基于表单的⻚⾯时,⽅法⼏乎与 前⾯创建⽹⻚时⼀样:定义 URL ,编写视图函数,并且编写模板。⼀个主 要差别是,需要导⼊包含表单的模块 forms.py 。

19.1 让用户能够输入数据

19.1 让⽤户能够输⼊数据 在建⽴⽤于创建⽤户账户的⾝份验证系统之前,我们添加⼏个⻚⾯,让⽤ 户能够输⼊数据。⽤户将能够添加新主题,添加新条⽬,以及编辑既有的 条⽬。 当前,只有超级⽤户能够通过管理⽹站输⼊数据。我们不想让⽤户与管理 ⽹站交互,因此将使⽤ Django 的表单创建⼯具来创建让⽤户能够输⼊数据 的⻚⾯。 19.1.1 添加新主题 我们⾸先让⽤户能够添加新主题。在创建基于表单的⻚⾯时,⽅法⼏乎与 前⾯创建⽹⻚时⼀样:定义 URL ,编写视图函数,并且编写模板。

这节解决什么:这一节主要解决《第 19 章 用户账户》里一个更具体的子问题:19.1 让用户能够输入数据 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

19.2 创建用户账户

19.2 创建⽤户账户 本节将建⽴⽤户注册和⾝份验证系统,让⽤户能够注册账户、登录和注 销。为此,我们将新建⼀个应⽤程序,其中包含与处理⽤户账户相关的所 有功能。这个应⽤程序将尽可能使⽤ Django ⾃带的⽤户⾝份验证系统来完 成⼯作。本节还将对模型 Topic 稍作修改,让每个主题都归属于特定的⽤ 户。

这节解决什么:这一节主要解决《第 19 章 用户账户》里一个更具体的子问题:19.2 创建用户账户 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

19.3 让用户拥有自己的数据

19.3 让⽤户拥有⾃⼰的数据 ⽤户应该能够在学习笔记中输⼊私有数据,因此我们将创建⼀个系统,先 确定各项数据所属的⽤户,再限制⽤户对⻚⾯的访问,让他们只能使⽤⾃ ⼰的数据。 本节将修改模型 Topic,让每个主题都归属于特定的⽤户。这也将影响条 ⽬,因为每个条⽬都属于特定的主题。我们先来限制对⼀些⻚⾯的访问。 19.3.1 使⽤ @login_required 限制访问 Django 提供了装饰器 @login_required,有助于轻松地限制对某些⻚⾯ 的访问。

这节解决什么:这一节主要解决《第 19 章 用户账户》里一个更具体的子问题:19.3 让用户拥有自己的数据 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

19.4 小结

19.4 ⼩结 在本章中,你学习了如何使⽤表单来让⽤户添加新主题,添加新条⽬,以 及编辑既有条⽬。接着学习了如何实现⽤户账户,既让⽼⽤户能够登录和 注销,也能使⽤ Django 提供的表单 UserCreationForm 让⽤户创建新账 户。 建⽴简单的⽤户⾝份验证和注册系统后,你通过装饰器 @login_required 禁⽌了未登录的⽤户访问特定的⻚⾯。然后使⽤外键 将数据关联到特定的⽤户,还迁移了要求指定默认数据的数据库。

这节解决什么:这一节主要解决《第 19 章 用户账户》里一个更具体的子问题:19.4 小结 该怎样落到实际代码或项目动作上。

怎么用到自己的系统:不要只把它当书中的小节标题,最好把它改写成一个你能亲手运行、修改或调试的微练习。

提醒:常见误区是只看懂例子表面流程,却没有把这一节抽成自己能迁移的规则。

辨析题

为什么‘用户账户’会让一个练习应用突然像真实产品?

本章图版学习路径

一旦有用户,程序就必须处理归属和边界

会话意识是在理解‘这个用户现在正处于什么状态’