Web 程序通常有两种部署方式：传统部署和云部署。传统部署指的是在使用物理主机或虚拟主机上部署程序，你通常需要在一个 Linux 系统上完成所有的部署操作；云部署则是使用其他公司提供的云平台，这些平台为你设置好了底层服务，包括 Web 服务器、数据库等等，你只需要上传代码并进行一些简单设置即可完成部署。这一章我们会介绍使用云平台 PythonAnywhere 来部署程序。[...]
虽然我们的程序开发已经完成，但随着功能的增多，把所有代码放在 app.py 里会让后续的开发和维护变得麻烦。这一章，我们要对项目代码进行一次重构，让项目组织变得更加合理。Flask 对项目结构没有固定要求，你可以使用单脚本，也可以使用包。这一章我们会学习使用包来组织程序。先来看看我们目前的项目文件结构：[...]
在开发大型程序时，为程序编写自动化测试是非常重要的。手动测试所有功能不仅耗时而且容易出错，而自动化测试可以减轻这个负担并提高测试的可靠性。本章我们将介绍如何使用 Python 的 unittest 测试框架编写单元测试。单元测试单元测试是对程序中的独立单元（如函数、方法）进行测试的一种形式。我们将使用 Python 标准库中的 unittest 框架来编写单元测试。下面通过一个简单的例子来介绍一些基本概念。[...]
本章我们将为程序添加用户认证功能。这将把用户分成两类：管理员和访客。管理员可以通过用户名和密码登录程序，并执行与数据相关的操作；而访客只能浏览页面。在开始之前，我们先来了解如何将密码安全地存储到数据库中。安全储存密码把密码明文存储在数据库中是极其危险的，假如攻击者窃取了你的数据库，那么用户的账号和密码就会被直接泄露。更保险的方式是对每个密码进行计算生成独一无二的密码散列值，这样即使攻击者拿到了散列值，也几乎无法逆向获取到密码。[...]
在HTML页面中，我们可以使用表单来获取用户输入的数据。下面是一个典型的表单示例： 名字 职业 在这段HTML代码中，我们使用 标签来定义一个表单，并通过method属性将提交方法设置为POST。 元素用于创建表单字段，其中type属性指定为"text"表示创建文本输入框，name属性定义了字段的名称，id属性指定了对应的标识符，用于与 元素进行关联。最后的 元素类型设置为"submit"表示创建提交按钮。[...]
下面是几个非常实用的模板编写技巧，为实现创建和编辑电影条目打下基础。自定义错误页面： 在Flask程序中自定义错误页面非常简单。首先，我们可以编写一个404错误页面模板，例如templates/404.html：[...]
在这个教程中，我们选择了SQLite作为数据库管理系统（DBMS）。SQLite是一种关系型数据库管理系统（RDBMS），它基于文件，不需要单独启动数据库服务器。SQLite适合在开发时使用，或者在数据库操作简单、访问量低的程序中使用。SQLite具有以下优点：简单易用：SQLite的设置和配置非常简单，无需复杂的服务器安装和配置过程。轻量级：SQLite数据库以单个文件的形式存储在磁盘上，占用空间小且资源消耗较少。无服务器：与其他关系型数据库管理系统相比，SQLite不需要独立运行的数据库服务器，可以直接与应用程序集成。跨平台：SQLite可在多个操作系统上运行，包括Windows、Mac和Linux等。[...]
静态文件（static files）是指那些不需要动态生成的文件，例如图片、CSS文件和JavaScript脚本等。在Flask中，我们需要创建一个名为static的文件夹来存放静态文件。这个文件夹应该与程序模块和templates文件夹处于同一目录层级。因此，在项目的根目录下创建static文件夹：$ mkdir static[...]
在一般的 Web 程序中，访问一个地址通常会返回一个包含各种信息的 HTML 页面。由于我们的程序是动态的，页面中的某些信息需要根据不同的情况进行调整，例如对登录和未登录用户显示不同的信息，因此页面需要在用户访问时根据程序逻辑动态生成。我们将包含变量和运算逻辑的 HTML 或其他格式的文本称为模板，而执行这些变量替换和逻辑计算的过程称为渲染。在本章中，我们将学习如何使用模板渲染引擎——Jinja2。根据默认设置，Flask 会从程序实例所在模块的同级目录中的 templates 文件夹中寻找模板。由于我们的程序目前存储在项目根目录的 app.py 文件中，所以我们需要在项目根目录创建该文件夹：[...]
在Flask中编写主页在这一章中，我们的主要任务是为我们的程序编写一个简单的主页。主页的URL通常是根地址，即/。当用户访问根地址时，我们需要返回一行欢迎文字。下面是编写这个任务所需的代码：[...]