/images/author.jpg

Top Cpu

Cpu(s): 1.4%us, 1.4%sy, 0.0%ni, 48.6%id, 45.8%wa, 1.4%hi, 1.4%si, 0.0%st 项 对应英文 中文翻译 us user CPU time 用户空间占用CPU百分比 sy system CPU time 内核空间占用CPU百分比 ni is meaning of nice CPU time 用户进程空间内改变过优先级的进程占用CPU百分比 id idle 空闲CPU百分比 wa iowait 等待输入输出的CPU时间百分比 hi hardware irq 硬件中断 si software irq 软件中断 st steal time 实时

hugo

logo https://favicon.io/favicon-generator/ https://www.remove.bg/zh/upload 国际代码 https://www.cnblogs.com/ant-jmf17/p/7278850.html 图标格式转换 https://www.aconvert.com/cn/image/png-to-svg/ hugo 安装 网站生成 发布状态:true nginx 配置 public 配置 https 配置 域名申请 域名备案 域名备案确认,电话确认 网管局域名备案 @a 域名配置 hugo高级 scss https://gohugo.io/hugo-pipes/postcss/

后记

后记 恭喜,你已经完成了整个 Flask 入门教程。不出意外的话,你也编写了你的第一个 Web 程序,并把它部署到了互联网上。这是一件值得纪念的事,它可以作为你的编程学习之路上的一个小小的里程碑。继续加油! 留言 & 打卡 如果你完成了这个教程,可以在 HelloFlask 论坛上的这个主题留言打卡,欢迎分享你的心得体会和经验总结。如果你对这本书有改进建议,可以在这个主题留言反馈。 进阶阅读 说来惭愧,在这本教程几乎每一章的结尾,我都会提到《Flask Web 开发实战》,每次写到这里,我都觉得自己好像在写“问候家明”。所以,最合适的进阶读物我已经推荐过很多次了。除了这本书,其他的进阶读物如下: Flask 官方文档 Flask Mega-Tutorial 知乎专栏 Hello, Flask! 未完待续 你喜欢这本书以及这本书的写作模式吗? 如果有足够的人喜欢的话,或许我会考虑写一本包含 Flask 进阶知识的《Flask 进阶教程》。按照设想,在这个进阶教程里,这个 Watchlist 程序变成一个支持多人注册和使用的简化版豆瓣电影 / IMDb。同时介绍各类常用扩展的使用和 Flask 上下文、蓝本等进阶知识。 再或者,这个教程或许会升级为一本完整的书,使用类似的编写模式,引入一个更加丰富有趣的程序,包含优化后的入门知识和 Flask 进阶内容。 如果你期待这样一本进阶教程 / 书的出现,欢迎让我知道。

小挑战

小挑战 经过本书的学习,你应该有能力独立开发一个简单的 Web 程序了。所以这里有一个小挑战:为你的 Watchlist 添加一个留言板功能,效果类似 SayHello。 下面是一些编写提示: 编写表示留言的模型类,更新数据库表 创建留言页面的模板 在模板中添加留言表单 添加显示留言页面的视图函数 在显示留言页面的视图函数编写处理表单的代码 生成一些虚拟数据进行测试 编写单元测试 更新到部署后的程序 可以参考 SayHello 源码 如果在完成这个挑战的过程中遇到了困难,可以在 HelloFlask 论坛发起讨论(设置帖子分类为“Flask 入门教程”)。除此之外,你可以在后记查看更多讨论的去处。

第 11 章:部署上线

第 11 章:部署上线 在这个教程的最后一章,我们将会把程序部署到互联网上,让网络中的其他所有人都可以访问到。 Web 程序通常有两种部署方式:传统部署和云部署。传统部署指的是在使用物理主机或虚拟主机上部署程序,你通常需要在一个 Linux 系统上完成所有的部署操作;云部署则是使用其他公司提供的云平台,这些平台为你设置好了底层服务,包括 Web 服务器、数据库等等,你只需要上传代码并进行一些简单设置即可完成部署。这一章我们会介绍使用云平台 PythonAnywhere 来部署程序。 部署前的准备 首先,我们需要生成一个依赖列表,方便在部署环境里安装。使用下面的命令把当前依赖列表写到一个 requirements.txt 文件里: 1 (env) $ pip freeze > requirements.txt 对于某些配置,生产环境下需要使用不同的值。为了让配置更加灵活,我们把需要在生产环境下使用的配置改为优先从环境变量中读取,如果没有读取到,则使用默认值: 1 2 app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'dev') app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(os.path.dirname(app.root_path), os.getenv('DATABASE_FILE', 'data.db')) 以第一个配置变量为例,os.getenv('SECRET_KEY', 'dev') 表示读取系统环境变量 SECRET_KEY 的值,如果没有获取到,则使用 dev。 注意 像密钥这种敏感信息,保存到环境变量中要比直接写在代码中更加安全。 对于第二个配置变量,我们仅改动了最后的数据库文件名。在示例程序里,因为我们部署后将继续使用 SQLite,所以只需要为生产环境设置不同的数据库文件名,否则的话,你可以像密钥一样设置优先从环境变量读取整个数据库 URL。 在部署程序时,我们不会使用 Flask 内置的开发服务器运行程序,因此,对于写到 .env 文件的环境变量,我们需要手动使用 python-dotenv 导入。下面在项目根目录创建一个 wsgi.py 脚本,在这个脚本中加载环境变量,并导入程序实例以供部署时使用: wsgi.py:手动设置环境变量并导入程序实例 1 2 3 4 5 6 7 8 9 import os from dotenv import load_dotenv dotenv_path = os.path.join(os.path.dirname(__file__), '.env') if os.path.exists(dotenv_path): load_dotenv(dotenv_path) from watchlist import app 这两个环境变量的具体定义,我们将在远程服务器环境创建新的 .env 文件写入。 最后让我们把改动提交到 Git 仓库,并推送到 GitHub 上的远程仓库: 1 2 3 $ git add . $ git commit -m "Ready to deploy" $ git push 提示 你可以在 GitHub 上查看本书示例程序的对应 commit:92eabc8。 使用 PythonAnywhere 部署程序 首先访问注册页面注册一个免费账户。注册时填入的用户名将作为你的程序域名的子域部分,以及分配给你的 Linux 用户名。比如,如果你的用户名为 greyli,最终为你分配的程序域名就是 http://greyli.pythonanywhere.com/。 注册完成后会有一个简单的教程,你可以跳过,也可以跟着了解一下基本用法。管理面板主页如下所示: 导航栏

第 10 章:组织你的代码

第 10 章:组织你的代码 虽然我们的程序开发已经完成,但随着功能的增多,把所有代码放在 app.py 里会让后续的开发和维护变得麻烦。这一章,我们要对项目代码进行一次重构,让项目组织变得更加合理。 Flask 对项目结构没有固定要求,你可以使用单脚本,也可以使用包。这一章我们会学习使用包来组织程序。 先来看看我们目前的项目文件结构: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ├── .flaskenv ├── app.py ├── test_watchlist.py ├── static │ ├── favicon.ico │ ├── images │ │ ├── avatar.png │ │ └── totoro.gif │ └── style.css └── templates ├── 400.html ├── 404.html ├── 500.html ├── base.html ├── edit.html ├── index.html ├── login.html └── settings.html 使用包组织代码 我们会创建一个包,然后把 app.py 中的代码按照类别分别放到多个模块里。下面是我们需要执行的一系列操作(这些操作你也可以使用文件管理器或编辑器完成): 1 2 3 4 $ mkdir watchlist # 创建作为包的文件夹 $ mv static templates watchlist # 把 static 和 templates 文件夹移动到 watchlist 文件夹内 $ cd watchlist # 切换进包目录 $ touch __init__.py views.py errors.py models.py commands.py # 创建多个模块 我们把这个包称为程序包,包里目前包含的模块和作用如下表所示: 模块 作用 __init__.py 包构造文件,创建程序实例 views.py 视图函数 errors.py 错误处理函数 models.py 模型类 commands.py 命令函数 提示 除了包构造文件外,其他的模块文件名你可以自由修改,比如 views.py 也可以叫 routes.py。 创建程序实例,初始化扩展的代码放到包构造文件里(__init__.py),如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import os import sys from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager # ... app = Flask(__name__) app.config['SECRET_KEY'] = 'dev' # 注意更新这里的路径,把 app.root_path 添加到 os.path.dirname() 中 # 以便把文件定位到项目根目录 app.config['SQLALCHEMY_DATABASE_URI'] = prefix + os.path.join(os.path.dirname(app.root_path), 'data.db') app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) login_manager = LoginManager(app) @login_manager.user_loader def load_user(user_id): from watchlist.models import User user = User.query.get(int(user_id)) return user login_manager.login_view = 'login' @app.context_processor def inject_user(): from watchlist.models import User user = User.query.first() return dict(user=user) from watchlist import views, errors, commands 在构造文件中,为了让视图函数、错误处理函数和命令函数注册到程序实例上,我们需要在这里导入这几个模块。但是因为这几个模块同时也要导入构造文件中的程序实例,为了避免循环依赖(A 导入 B,B 导入 A),我们把这一行导入语句放到构造文件的结尾。同样的,load_user() 函数和 inject_user() 函数中使用的模型类也在函数内进行导入。 其他代码则按照分类分别放到各自的模块中,这里不再给出具体代码,你可以参考源码仓库。在移动代码之后,注意添加并更新导入语句,比如使用下面的导入语句来导入程序实例和扩展对象: 1 from watchlist import app, db 使用下面的导入语句来导入模型类: 1 from watchlist.models import User, Movie 以此类推。 组织模板 模块文件夹 templates 下包含了多个模板文件,我们可以创建子文件夹来更好的组织它们。下面的操作创建了一个

Flask 入门教程

Flask 入门教程 这是一本 Flask 入门教程,提供了入门 Flask 所需的最少信息,你可以跟随本书自己动手开发一个简单的 Watchlist 程序。本书主页为 http://helloflask.com/tutorial。 关于作者 我叫李辉,我是《Flask Web 开发实战》的作者,Pallets Team 成员。你可以在我的个人主页了解更多关于我的信息。 目录 前言 第 1 章:准备工作 第 2 章:Hello, Flask! 第 3 章:模板 第 4 章:静态文件 第 5 章:数据库 第 6 章:模板优化 第 7 章:表单 第 8 章:用户认证 第 9 章:测试 第 10 章:组织你的代码 第 11 章:部署上线 小挑战 后记 版权信息 书名:Flask 入门教程 副书名:使用 Python 和 Flask 开发你的第一个 Web 程序 作者:李辉 版本:2.0 发布时间:2019.12.6 © 2018 李辉(Grey Li) / HelloFlask.com 本书采用 CC BY-NC-ND 3.0 协议授权,禁止商用、演绎后分发或无署名转载。

Summary

Summary 简介 前言 第 1 章:准备工作 第 2 章:Hello, Flask! 第 3 章:模板 第 4 章:静态文件 第 5 章:数据库 第 6 章:模板优化 第 7 章:表单 第 8 章:用户认证 第 9 章:测试 第 10 章:组织你的代码 第 11 章:部署上线 小挑战 后记 我是标题6 h6. 我是副标题6 h6 WWW

前言

前言 Flask 是一个使用 Python 语言编写的 Web 框架,它可以让你高效的编写 Web 程序。Web 程序即“网站”或“网页程序”,是指可以通过浏览器进行交互的程序。我们日常使用浏览器访问的豆瓣、知乎、百度等网站都是 Web 程序。 通过这本书,你会学到 Flask 开发的基础知识,并开发出一个简单的 Watchlist(观影清单)程序。 当你想要完成一个比较大的目标时,通常你会把这个目标分解成多个小目标,然后逐一去完成。开发程序也是这样,在一开始就编写出像豆瓣、IMDB 这样的程序恐怕不太现实,但是我们可以先模仿其中的一小部分。我们要完成的 Watchlist 程序就是一个很好的开始。在功能上,这个程序可以看做是简化版的 IMDB Watchlist / 豆瓣豆单:你可以添加、删除和修改你收藏的电影信息。 你可以访问 http://watchlist.helloflask.com/ 查看示例程序的在线 Demo。 本书特点 基于 Flask 最新的 1.0.2 版本 使用一个 Watchlist 程序作为示例 复原完整的开发流程 只提供入门所需的最少信息 优化术语解释,更容易理解 阅读方法 本书复原了编写这个 Watchlist 程序的完整流程,包括每一行代码块,每一个需要执行的命令。在阅读时,你需要自己输入每一个代码和命令,检查输出是否和书中一致。在这个过程中,你也可以对它进行一些调整。比如,示例程序的界面语言使用了英文,你可以修改为中文或是其他语言。对于页面布局和样式,你也可以自由修改。 在本书的最后,你会把你自己编写的 Watchlist 部署到互联网上,让任何人都可以访问。 讨论与求助 如果你想和其他同学交流 Flask、Web 开发等相关话题,或是在学习中遇到了问题,想要寻求帮助,下面是一些好去处: HelloFlask 论坛(最容易获得回答) HelloFlask 微信群 HelloFlask QQ 群(419980814) HelloFlask Telegram 群组(@helloflask) 反馈与勘误 欢迎通过下面的方式提出反馈、建议和勘误: 在源码仓库创建 Issue。 在 HelloFlask 论坛发布帖子,并选择“Flask 入门教程”分类。 在专栏对应的连载文章下面撰写评论。 相关资源 本书主页:http://helloflask.com/tutorial 本书论坛:https://discuss.helloflask.com 本书源码:https://github.com/greyli/flask-tutorial 本书示例程序源码:https://github.com/greyli/watchlist 示例程序在线 Demo:http://watchlist.helloflask.com

第 1 章:准备工作

第 1 章:准备工作 在通过这本书学习 Flask 开发前,我假设你已经了解了 Python 和 HTML 的基础知识。如果还没有,那么可以先从下面这些在线资源入手: 《使用 HTML、CSS 和 Javascript 构建简单的网站》 - Microsoft Learn 《Web 入门教程》》 - MDN 《使用 Python 迈出第一步》 - Microsoft Learn 《Python 教程》 - Python.org 这个教程对你的 Python 版本或操作系统没有要求:你的 Python 版本可以是 2.7,也可以是 3.3 及以上版本。电脑的操作系统可以是 Windows,也可以是 macOS 或 Linux。 安装编辑器和浏览器 对于编辑器来说,每个人都有不同的偏好,你可以自由选择。可以选择功能丰富的IDE(集成开发环境),比如 PyCharm;也可以选择相对轻量的编辑器,比如 Atom 或 Sublime Text。浏览器建议使用 Firefox 或 Chrome。 使用命令行 在本书中,你需要使用命令行窗口来执行许多操作。你可以使用 Windows 下的 cmd.exe,或是 macOS 和 Linux 下的终端(Terminal)。下面我们执行一个最简单的 whoami 命令(即 Who Am I?): 1 2 $ whoami greyli 这个命令会打印出当前计算机用户的名称。其他常用的命令还有 cd 命令,用来切换目录(change directory);mkdir 命令,用来创建目录(make directory)。在不同的操作系统上,执行某个操作的命令可能会有所不同,在必要的地方,书里会进行提示。 我们先来为我们的程序创建一个文件夹: 1 2 $ mkdir watchlist $ cd watchlist 除非特别说明,从现在开始,本书假设你的工作目录将是在项目的根目录,即 watchlist/ 目录。 为了确保你已经正确安装了 Python,可以执行下面的命令测试是否有报错: 1 2 $ python --version Python 2.7.11 在 Linux 和 macOS 中,对应 Python 3 版本的命令将会是 python3(类似的,Python 3 对应的 pip 命令为 pip3): 1 2 $ python3 --version Python 3.8.3 对于 Windows(非 WSL) 用户,如果你对不同系统下终端命令的区别不熟悉,可以考虑在这个教程的学习过程中使用 Git Bash(安装 Git for Windows 后附带的终端程序,下一节会介绍 Git 安装) 来代替系统自带的 cmd.exe 或 Powershell。Git Bash 支持一些在 Linux 或 macOS 下才能使用的命令(程序),比如 ls、cat、nano、ssh 等,这些命令我们在后面会用到。 提示 如果你打算在这个教程的学习中继续使用 cmd.exe 或 Powershell,那么需要注意下列命令的区别: 在 cmd.exe 中使用 dir 命令替代 ls 命令,使用 type 命令替代 cat 命令 对于 nano 命令,你可以替换为其他已安装的编辑器命令,比如对于 VS Code,可以使用 code 命令。或者,你也可以直接使用编辑器的图形界面创建文件并编辑。 对于 Windows 10 1809,O