🧪 第0章 Flask 的概要与环境架设
📄 一句话概括

编辑器里那三样设置,落地只有三个文件:settings.json 和 pyproject.toml。 检查器管「哪错了」,格式化器管「长什么样」,两件事别混着指望一个工具。 .gitignore 里的 .venv/ 那个斜杠很要紧——它只匹配目录,不匹配同名文件。

📝 本章和前面几章的关系

这一篇对应教材 0.4 节的后四小节:装 VS Code、用检查器与格式化器、给 VS Code 指定虚拟环境、 写 .gitignore。 教材用的 flake8 加 autopep8,本机用 ruff 一个工具代两者,原理一样。

一、第一件事:让编辑器知道用哪个解释器

VS Code 右下角有个 Python 版本号,点它可以选解释器。 选了 .venv 里那个,插件的补全、跳转、检查才对着正确的依赖。 不选的话它默认用全局解释器——于是你明明装了 Flask,它还是画红线说找不到。 这是新手最常报的假错:代码没错,是编辑器看错了环境。

选完它会在 .vscode/settings.json 里记一行 python.defaultInterpreterPath。

二、第二件事:检查器

检查器(linter)干一件事:不运行代码,只看写法,指出可能的问题。 教材用 flake8。 它查两类东西:一类是逻辑问题(import 了没用、变量未定义),一类是风格问题(行太长、缩进不对)。 本机用 ruff。它是 flake8 的现代替代,用 Rust 写的,快得多,而且一个工具同时管检查和格式化。

配置不写在编辑器里,写在项目根目录的 pyproject.toml——这样换编辑器、进 CI 都认同一份规则。

三、第三件事:格式化器

格式化器(formatter)不改逻辑,只改形状:缩进、空格、换行、引号。 教材用 autopep8。它的原则是「只做最小改动」,所以有时改得不够彻底。 ruff format 更接近 black 的风格:宁可多改几行,也要让所有人写出来一个样。

两件事的分工要清楚:检查器告诉你哪里不对,格式化器直接改成对的形状。 VS Code 里可以设「保存时自动格式化加自动修」,就是把后者挂到保存事件上。

四、第四件事:.gitignore 该写哪几行

教材 0.4.8 节给了一份清单,核心是四类:虚拟环境、缓存、运行期生成的实例目录、密钥文件。

要忽略的 为什么
.venv/ 依赖目录,几百兆,谁都能重建
pycache/ 字节码缓存,Python 自己会生成
*.pyc 同上,散落在各处的单个文件
instance/ Flask 放数据库和密钥的地方,跑起来才有
.env 里面有密钥,绝对不能进仓库

.venv/ 后面那个斜杠一定要写。不写的话,一个叫 .venv 的文件也会被忽略; 写了斜杠,只匹配目录。 .env 同理,但它不是目录,所以不加斜杠——它是「密钥文件」,一旦进了仓库,等于把密码贴到公告栏上。

五、动手 Demo:编辑器里的三件套:解释器、检查器、格式化

VS Code 的界面装不了,但检查器、格式化器、.gitignore 这三样都能真跑。 先造一个故意写坏的文件,让 ruff 挑错,再让它改,最后验一遍忽略规则。

# pyproject.toml
[tool.ruff]
line-length = 72

[tool.ruff.lint]
select = ["E", "F"]

# 然后:ruff check bad.py  /  ruff format --diff bad.py

实跑输出:

--------------------------------------------------------------------
编辑器里的三件套:解释器、检查器、格式化
--------------------------------------------------------------------
  教材讲 VS Code 装 Python 插件、选解释器、配 flake8 与 autopep8。
  这三样里后两样本质就是「一个查、一个改」,本机用 ruff 一个工具全包了。

  [待检查的 bad.py]
  | import json
  | import os
  | import sys
  |
  |
  | def area(w, h):
  |     s=w*h
  |     return  s
  |
  |
  | print(area(3, 4), sys.argv, "这一行故意写得很长……")
  故意写坏:两个没用的 import、等号两边没空格、return 后面两个空格、最后一行超长。


  ① 检查器怎么说
  --------------------------------------------------------------------
  ruff check 返回码 1
  F401 [*] json imported but unused
   --> bad.py:1:8
    |
  1 | import json
    |        ^^^^
  2 | import os
  3 | import sys
    |
  help: Remove unused import: json
    |
    - import json
  1 | import os
    |
  F401 [*] os imported but unused
   --> bad.py:2:8
    |
  1 | import json
  2 | import os
    |        ^^
  3 | import sys
    |
  help: Remove unused import: os
    |
  1 | import json
    - import os
  2 | import sys
    |
  E501 Line too long (111 > 72)
    --> bad.py:11:52
     |
  11 | print(area(3, 4), sys.argv, "这一行故意写得很长,用来触发行长检查,
  长度必须超过七十二个字符才会被 ruff 抓出来")
     |                                                                          ^^^^^^^^^^^^^^^...
  Found 3 errors.
  [*] 2 fixable with --fix.
  ! F401 是「import 了没用」,E501 是「这行太长」。
  F 开头是逻辑问题,E 开头是风格问题——VS Code 里画黄线的就是这两类。

  ② 格式化器怎么说
  --------------------------------------------------------------------
  --- bad.py
  +++ bad.py
  @@ -4,8 +4,12 @@
  -    s=w*h
  -    return  s
  +    s = w * h
  +    return s
  -print(area(3, 4), sys.argv, "这一行故意写得很长,用来触发行长检查,
  长度必须超过七十二个字符才会被 ruff 抓出来")
  +print(
  +    area(3, 4),
  +    sys.argv,
  +    "这一行故意写得很长,用来触发行长检查,长度必须超过七十二个字符才会被 ruff 抓出来",
  +)
  ! 格式化只改形状,不改逻辑:等号两边补空格、return 后面多余的空格删掉。
  教材里的 autopep8 干的是同一件事,ruff format 是它的现代替代。

  ③ .gitignore:哪些东西不该进仓库
  --------------------------------------------------------------------

| 路径 | 结果 | 命中的规则 |
|---|---|---|
| .venv/Lib | 忽略 | .gitignore:1:.venv/ |
| __pycache__/x | 忽略 | .gitignore:2:__pycache__/ |
| a.pyc | 忽略 | .gitignore:3:*.pyc |
| instance/db.sqlite | 忽略 | .gitignore:4:instance/ |
| .env | 忽略 | .gitignore:5:.env |
| static/logo.png | 提交 | — |
| app.py | 提交 | — |

  ! .venv/ 和 instance/ 后面那个斜杠很要紧:它只匹配目录。
  写成 .venv 会连一个叫 .venv 的文件也一起忽略。
  instance/ 是 Flask 放数据库和密钥文件的地方,教材第 2 章会用到;
  这类「跑起来才生成」的目录,一律不该进仓库。
  结论:编辑器里那三样设置,落地就三个东西——解释器路径、检查器规则、格式化开关。
  前一个存进 .vscode/settings.json,后两个存进 pyproject.toml。

ruff 报了三条:两条 F401(import 了没用)、一条 E501(行太长,111 超过 72)。 --fix 能自动修掉两条 F401,E501 得人来拆行——自动修只解决机械问题,判断还得人做。 格式化那一段的 diff 是真输出:等号两边补空格、return 后面多余的空格删掉,超长那行被拆成多行。 git check-ignore -v 会告诉你「这条路径是被哪一行规则忽略的」,比盯着 .gitignore 猜快得多。

30 秒实验

  1. 把 line-length 改成 120,重跑 ruff check,看 E501 还在不在。
  2. 在 .gitignore 里把 .venv/ 改成 .venv, 再用 git check-ignore -v 看一条叫 .venv 的文件是否被忽略。
  3. 给 bad.py 加一行 print(1/0),看 ruff 会不会报——想一想为什么它不报。

常见误区

  1. 把检查器和格式化器当一回事:一个查、一个改,配错了等于没配。
  2. 规则写在编辑器设置里:换台电脑就丢,进 CI 也不认;写进 pyproject.toml 才是项目资产。
  3. .gitignore 写 .venv 不带斜杠:会误伤同名文件,虽然少见,但一旦发生很难查。
  4. 把 .env 提交上去:密钥泄露最常见的一条路径,没有之一。
自测三问(点开对答案) 1. 检查器和格式化器分别解决什么问题? —— 检查器指出「哪写错了、哪里不规范」,格式化器直接把形状改成统一的,不改逻辑。 2. 为什么 `.venv/` 要带斜杠? —— 斜杠表示只匹配目录。不带斜杠,一个同名的文件也会被忽略。 3. VS Code 里「找不到 flask 模块」的红线,最可能是什么原因? —— 解释器选错了,用的是全局解释器而不是项目虚拟环境里的那个。

环境这一章到此结束。 下一章正式动手:从 MVT 讲起,写出第一个能跑的应用,再把路由、模板、表单一样样加上去。

相关笔记