Visual Studio Code 中的 Flask 教程
Flask 是一个轻量级的 Python Web 应用程序框架,它为 URL 路由和页面渲染提供了基本功能。
Flask 被称为“微”框架,因为它不直接提供诸如表单验证、数据库抽象、身份验证等功能。这些功能由称为 Flask 扩展的特殊 Python 包提供。这些扩展与 Flask 无缝集成,因此它们看起来好像是 Flask 本身的一部分。例如,Flask 不提供页面模板引擎,但是安装 Flask 默认包含 Jinja 模板引擎。为了方便起见,我们通常将这些默认设置视为 Flask 的一部分。
在本 Flask 教程中,你将创建一个简单的 Flask 应用程序,其中包含三个使用通用基本模板的页面。在此过程中,你将体验 Visual Studio Code 的许多功能,包括使用终端、编辑器、调试器、代码片段等。
本 Flask 教程的完整代码项目可在 GitHub 上找到:python-sample-vscode-flask-tutorial。
如果你有任何问题,可以在 Python 扩展讨论问答 中搜索答案或提出问题。
先决条件
要成功完成本 Flask 教程,你必须执行以下操作(与通用 Python 教程中的步骤相同)
-
安装 Python 扩展。
-
安装 Python 3 的版本(本教程是为该版本编写的)。选项包括
- (所有操作系统)从 python.org 下载;通常使用页面上首先出现的 下载 按钮。
- (Linux)内置的 Python 3 安装效果良好,但是要安装其他 Python 包,你必须在终端中运行
sudo apt install python3-pip
。 - (macOS)使用
brew install python3
通过 Homebrew 在 macOS 上安装。 - (所有操作系统)从 Anaconda 下载(用于数据科学目的)。
-
在 Windows 上,请确保你的 Python 解释器的位置已包含在 PATH 环境变量中。你可以通过在命令提示符下运行
path
来检查该位置。如果未包含 Python 解释器的文件夹,请打开“Windows 设置”,搜索“环境”,选择 编辑帐户的环境变量,然后编辑 Path 变量以包含该文件夹。
为 Flask 教程创建一个项目环境
在本节中,你将创建一个虚拟环境,并在其中安装 Flask。使用虚拟环境可以避免将 Flask 安装到全局 Python 环境中,并且可以精确控制应用程序中使用的库。
-
在你的文件系统中,为本教程创建一个文件夹,例如
hello_flask
。 -
通过在终端中导航到该文件夹并运行
code .
,或者通过运行 VS Code 并使用 文件 > 打开文件夹 命令,在 VS Code 中打开此文件夹。 -
在 VS Code 中,打开命令面板(查看 > 命令面板 或 (⇧⌘P (Windows,Linux Ctrl+Shift+P)))。然后选择 Python:创建环境 命令,在你的工作区中创建一个虚拟环境。选择
venv
,然后选择你想要用来创建它的 Python 环境。注意:如果你想要手动创建环境,或者在环境创建过程中遇到错误,请访问 环境 页面。
-
在你的虚拟环境创建完成后,从命令面板中运行 终端:创建新终端 (⌃⇧` (Windows,Linux Ctrl+Shift+`))),这将创建一个终端,并通过运行其激活脚本来自动激活虚拟环境。
注意:在 Windows 上,如果你的默认终端类型是 PowerShell,你可能会看到错误,指出它无法运行 activate.ps1,因为系统上禁用了脚本运行。该错误提供了一个链接,其中包含有关如何允许脚本的信息。否则,请使用 终端:选择默认配置文件 将“命令提示符”或“Git Bash”设置为你的默认值。
-
通过在 VS Code 终端中运行以下命令,在虚拟环境中安装 Flask
python -m pip install flask
你现在有了一个自包含的环境,可以编写 Flask 代码了。当你使用 终端:创建新终端 时,VS Code 会自动激活该环境。如果你打开一个单独的命令提示符或终端,请通过运行 source .venv/bin/activate
(Linux/macOS) 或 .venv\Scripts\Activate.ps1
(Windows) 来激活该环境。当命令提示符在开头显示 (.venv) 时,你就知道该环境已激活。
创建并运行一个最小的 Flask 应用程序
-
在 VS Code 中,使用菜单中的 文件 > 新建,按 Ctrl+N,或使用资源管理器视图中的新建文件图标(如下所示),在你的项目文件夹中创建一个名为
app.py
的新文件。 -
在
app.py
中,添加代码以导入 Flask 并创建 Flask 对象的实例。如果你键入以下代码(而不是使用复制粘贴),你可以观察 VS Code 的 IntelliSense 和自动完成from flask import Flask app = Flask(__name__)
-
同样在
app.py
中,添加一个返回内容的函数,在这种情况下是一个简单的字符串,并使用 Flask 的app.route
装饰器将 URL 路由/
映射到该函数@app.route("/") def home(): return "Hello, Flask!"
提示:你可以在同一函数上使用多个装饰器,每行一个,具体取决于你想要将多少不同的路由映射到同一函数。
-
保存
app.py
文件 (⌘S (Windows, Linux Ctrl+S))。 -
在集成终端中,输入
python -m flask run
运行应用,这将启动 Flask 开发服务器。开发服务器默认查找app.py
。运行 Flask 时,您应该看到类似以下内容的输出:(.venv) D:\py\\hello_flask>python -m flask run * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
如果您看到错误提示找不到 Flask 模块,请确保您已在虚拟环境中运行了
python -m pip install flask
,如上一节末尾所述。另外,如果您想在不同的 IP 地址或端口上运行开发服务器,可以使用 host 和 port 命令行参数,例如
--host=0.0.0.0 --port=80
。 -
要使用默认浏览器打开渲染后的页面,请在终端中 Ctrl+单击
http://127.0.0.1:5000/
URL。 -
请注意,当您访问类似 / 的 URL 时,调试终端中会显示一条消息,其中显示了 HTTP 请求。
127.0.0.1 - - [11/Jul/2018 08:40:15] "GET / HTTP/1.1" 200 -
-
在终端中使用 Ctrl+C 停止应用。
提示:当使用
app.py
以外的文件名时,例如webapp.py
,您需要定义一个名为 FLASK_APP 的环境变量,并将其值设置为您选择的文件。Flask 的开发服务器随后将使用 FLASK_APP 的值,而不是默认文件app.py
。有关更多信息,请参阅 Flask 命令行界面。
在调试器中运行应用程序
调试使您有机会在特定代码行上暂停正在运行的程序。当程序暂停时,您可以检查变量,在“调试控制台”面板中运行代码,并利用 调试 中描述的其他功能。运行调试器还会自动保存调试会话开始前的任何修改过的文件。
开始之前:请确保您已按照上一节末尾的说明,使用终端中的 Ctrl+C 停止了正在运行的应用。如果您让应用在一个终端中运行,它将继续占用端口。因此,当您使用同一端口在调试器中运行应用时,原始运行的应用将处理所有请求,您将不会在正在调试的应用中看到任何活动,并且程序不会在断点处停止。换句话说,如果调试器似乎不起作用,请确保没有其他应用实例仍在运行。
-
将
app.py
的内容替换为以下代码,该代码添加了第二个路由和函数,您可以在调试器中逐步执行它们:import re from datetime import datetime from flask import Flask app = Flask(__name__) @app.route("/") def home(): return "Hello, Flask!" @app.route("/hello/<name>") def hello_there(name): now = datetime.now() formatted_now = now.strftime("%A, %d %B, %Y at %X") # Filter the name argument to letters only using regular expressions. URL arguments # can contain arbitrary text, so we restrict to safe characters only. match_object = re.match("[a-zA-Z]+", name) if match_object: clean_name = match_object.group(0) else: clean_name = "Friend" content = "Hello there, " + clean_name + "! It's " + formatted_now return content
新 URL 路由
/hello/<name>
使用的装饰器定义了一个可以接受任何附加值的端点 /hello/。路由中<
和>
内部的标识符定义了一个传递给函数的变量,并且可以在您的代码中使用。URL 路由区分大小写。例如,路由
/hello/<name>
与/Hello/<name>
不同。如果您希望同一个函数处理两者,请为每个变体使用装饰器。如代码注释中所述,请始终过滤任意用户提供的信息,以避免对您的应用进行各种攻击。在这种情况下,代码会过滤 name 参数,使其仅包含字母,从而避免注入控制字符、HTML 等。(当您在下一节中使用模板时,Flask 会自动进行过滤,您不需要此代码。)
-
通过执行以下任一操作,在
hello_there
函数的第一行代码 (now = datetime.now()
) 处设置断点:- 将光标放在该行上,按 F9,或者,
- 将光标放在该行上,选择 运行 > 切换断点 菜单命令,或者,
- 直接点击行号左侧的边距(当鼠标悬停在那里时,会出现一个褪色的红点)。
断点在左边距中显示为一个红点。
-
切换到 VS Code 中的 运行和调试 视图(使用左侧的活动栏或 ⇧⌘D (Windows, Linux Ctrl+Shift+D))。您可能会看到消息“要自定义运行和调试,请创建 launch.json 文件”。这意味着您还没有包含调试配置的
launch.json
文件。如果您点击 创建 launch.json 文件 链接,VS Code 可以为您创建该文件。 -
选择该链接,VS Code 将提示您选择调试配置。从下拉列表中选择 Flask,VS Code 将使用 Flask 运行配置填充新的
launch.json
文件。launch.json
文件包含多个调试配置,每个配置都是configuration
数组中的单独 JSON 对象。 -
向下滚动并检查配置,该配置名为“Python: Flask”。此配置包含
"module": "flask",
,它告诉 VS Code 在启动调试器时使用-m flask
运行 Python。它还在env
属性中定义了 FLASK_APP 环境变量,以标识启动文件,默认情况下为app.py
,但允许您轻松指定其他文件。如果要更改主机和/或端口,可以使用args
数组。{ "name": "Python Debugger: Flask", "type": "debugpy", "request": "launch", "module": "flask", "env": { "FLASK_APP": "app.py", "FLASK_DEBUG": "1" }, "args": [ "run", "--no-debugger", "--no-reload" ], "jinja": true, "justMyCode": true },
注意:如果您的配置中的
env
条目包含"FLASK_APP": "${workspaceFolder}/app.py"
,请将其更改为"FLASK_APP": "app.py"
,如上所示。否则,您可能会遇到类似“无法导入模块 C”的错误消息,其中 C 是项目文件夹所在的驱动器盘符。注意:创建
launch.json
后,编辑器中会显示一个 添加配置 按钮。该按钮会显示一个添加到配置列表开头的其他配置列表。(运行 > 添加配置 菜单命令执行相同的操作。) -
保存
launch.json
(⌘S (Windows, Linux Ctrl+S))。在调试配置下拉列表中,选择 Python: Flask 配置。 -
通过选择 运行 > 开始调试 菜单命令,或选择列表旁边的绿色 开始调试 箭头 (F5) 来启动调试器。
请注意,状态栏会更改颜色以指示正在调试。
调试工具栏(如下所示)也会出现在 VS Code 中,其中包含以下顺序的命令:暂停(或继续,F5)、单步跳过 (F10)、单步进入 (F11)、单步跳出 (⇧F11 (Windows, Linux Shift+F11))、重新启动 (⇧⌘F5 (Windows, Linux Ctrl+Shift+F5)) 和停止 (⇧F5 (Windows, Linux Shift+F5))。有关每个命令的说明,请参阅 VS Code 调试。
-
输出显示在“Python 调试控制台”终端中。 Ctrl+单击 该终端中的
http://127.0.0.1:5000/
链接,以在浏览器中打开该 URL。在浏览器的地址栏中,导航到http://127.0.0.1:5000/hello/VSCode
。在页面呈现之前,VS Code 会在您设置的断点处暂停程序。断点上的小黄色箭头表示它是要运行的下一行代码。 -
使用单步跳过运行
now = datetime.now()
语句。 -
在 VS Code 窗口的左侧,您会看到一个 变量 窗格,其中显示了局部变量(例如
now
)以及参数(例如name
)。下方是 监视、调用堆栈 和 断点 的窗格(有关详细信息,请参阅 VS Code 调试)。在 局部变量 部分中,尝试展开不同的值。您还可以双击值(或使用 Enter (Windows, Linux F2)) 来修改它们。但是,更改诸如now
之类的变量可能会破坏程序。开发人员通常只在代码最初没有生成正确值时才进行更改以更正值。 -
当程序暂停时,调试控制台 面板(与终端面板中的“Python 调试控制台”不同)允许您使用程序的当前状态来试验表达式和尝试代码片段。例如,一旦您单步跳过了
now = datetime.now()
行,您就可以尝试使用不同的日期/时间格式。在编辑器中,选择读取now.strftime("%A, %d %B, %Y at %X")
的代码,然后右键单击并选择 在调试控制台中求值 以将该代码发送到调试控制台,并在其中运行。now.strftime("%A, %d %B, %Y at %X") 'Wednesday, 31 October, 2018 at 18:13:39'
提示:调试控制台 还显示来自应用内部的异常,这些异常可能不会出现在终端中。例如,如果您在 运行和调试 视图的 调用堆栈 区域中看到“在异常处暂停”消息,请切换到 调试控制台 以查看异常消息。
-
将该行复制到调试控制台底部的 > 提示符中,并尝试更改格式。
now.strftime("%a, %d %B, %Y at %X") 'Wed, 31 October, 2018 at 18:13:39' now.strftime("%a, %d %b, %Y at %X") 'Wed, 31 Oct, 2018 at 18:13:39' now.strftime("%a, %d %b, %y at %X") 'Wed, 31 Oct, 18 at 18:13:39'
-
如果您愿意,请单步执行更多几行代码,然后选择继续 (F5) 以让程序运行。浏览器窗口显示结果。
-
更改代码中的行以使用不同的日期时间格式,例如
now.strftime("%a, %d %b, %y at %X")
,然后保存文件。Flask 服务器将自动重新加载,这意味着将应用更改,而无需重新启动调试器。刷新浏览器上的页面以查看更新。 -
完成后,关闭浏览器并停止调试器。要停止调试器,请使用停止工具栏按钮(红色方块)或 运行 > 停止调试 命令 (⇧F5 (Windows, Linux Shift+F5))。
提示:为了更容易地重复导航到特定的 URL(例如
http://127.0.0.1:5000/hello/VSCode
),请使用
转到定义和查看定义命令
在您使用 Flask 或任何其他库时,您可能想要检查这些库本身的代码。VS Code 提供了两个方便的命令,可以直接导航到任何代码中类和其他对象的定义:
-
跳转到定义 可以从你的代码跳转到定义对象的代码。例如,在
app.py
中,右键单击Flask
类(在app = Flask(__name__)
行中),然后选择 跳转到定义 (或者使用 F12),这将导航到 Flask 库中的类定义。 -
查看定义(⌥F12 (Windows Alt+F12,Linux Ctrl+Shift+F10),同样在右键单击上下文菜单中),与之类似,但直接在编辑器中显示类定义(在编辑器窗口中留出空间以避免遮挡任何代码)。按 Escape 关闭“查看”窗口,或使用右上角的 x。
使用模板呈现页面
你到目前为止在本教程中创建的应用程序仅从 Python 代码生成纯文本网页。尽管可以直接在代码中生成 HTML,但开发人员会避免这种做法,因为它会使应用程序容易受到 跨站点脚本 (XSS) 攻击。例如,在本教程的 hello_there
函数中,有人可能会想到使用类似 content = "<h1>Hello there, " + clean_name + "!</h1>"
的代码来格式化输出,其中 content
中的结果直接传递给浏览器。这种做法允许攻击者在 URL 中放置恶意 HTML,包括 JavaScript 代码,最终进入 clean_name
,从而在浏览器中运行。
一个更好的做法是完全将 HTML 保留在代码之外,使用 模板,这样你的代码只关注数据值,而不关注渲染。
- 模板是一个 HTML 文件,其中包含代码在运行时提供的值的占位符。模板引擎负责在渲染页面时进行替换。因此,代码仅关注数据值,而模板仅关注标记。
- Flask 的默认模板引擎是 Jinja,它在安装 Flask 时会自动安装。该引擎提供了灵活的选项,包括自动转义(以防止 XSS 攻击)和模板继承。通过继承,你可以定义一个具有通用标记的基页,然后在该基页的基础上构建特定于页面的添加项。
在本节中,你将使用模板创建一个页面。在接下来的章节中,你将配置应用程序以提供静态文件,然后为应用程序创建多个页面,每个页面都包含来自基本模板的导航栏。
-
在
hello_flask
文件夹中,创建一个名为templates
的文件夹,Flask 默认会在其中查找模板。 -
在
templates
文件夹中,创建一个名为hello_there.html
的文件,内容如下。此模板包含两个名为 “name” 和 “date” 的占位符,它们由成对的花括号{{
和}}
分隔。如你所见,你也可以直接在模板中包含格式化代码。<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Hello, Flask</title> </head> <body> {%if name %} <strong>Hello there, {{ name }}!</strong> It's {{ date.strftime("%A, %d %B, %Y at %X") }}. {% else %} What's your name? Provide it after /hello/ in the URL. {% endif %} </body> </html>
提示:Flask 开发人员通常使用 flask-babel 扩展进行日期格式化,而不是
strftime
,因为 flask-babel 会考虑区域设置和时区。 -
在
app.py
中,在文件顶部附近导入 Flask 的render_template
函数。from flask import render_template
-
同样在
app.py
中,修改hello_there
函数以使用render_template
加载模板并应用命名值(并添加一个路由来识别没有名称的情况)。render_template
假设第一个参数相对于templates
文件夹。通常,开发人员将模板命名为与使用它们的函数相同,但匹配的名称不是必需的,因为你始终在代码中引用确切的文件名。@app.route("/hello/") @app.route("/hello/<name>") def hello_there(name = None): return render_template( "hello_there.html", name=name, date=datetime.now() )
你可以看到代码现在简单得多,并且只关注数据值,因为标记和格式都包含在模板中。
-
启动程序(在调试器内部或外部,使用 ⌃F5 (Windows,Linux Ctrl+F5)),导航到 /hello/name URL,并观察结果。
-
还可以尝试使用类似
<a%20value%20that%20could%20be%20HTML>
的名称导航到 /hello/name URL,以查看 Flask 的自动转义功能。 “name” 值在浏览器中显示为纯文本,而不是渲染为实际元素。
提供静态文件
静态文件有两种类型。第一种是页面模板可以直接引用的样式表之类的文件。此类文件可以存在于应用程序中的任何文件夹中,但通常放置在 static
文件夹中。
第二种是你想在代码中寻址的文件,例如当你想实现一个返回静态文件的 API 端点时。为此,Flask 对象包含一个内置方法 send_static_file
,该方法生成一个响应,其中包含应用程序 static
文件夹中的静态文件。
以下各节演示了这两种类型的静态文件。
在模板中引用静态文件
-
在
hello_flask
文件夹中,创建一个名为static
的文件夹。 -
在
static
文件夹中,创建一个名为site.css
的文件,内容如下。输入此代码后,还请观察 VS Code 为 CSS 文件提供的语法突出显示,包括颜色预览。.message { font-weight: 600; color: blue; }
-
在
templates/hello_there.html
中,在</head>
标签之前添加以下行,该行创建对样式表的引用。<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='site.css')}}" />
此处使用的 Flask 的 url_for 标记创建了文件的适当路径。由于它可以接受变量作为参数,因此如果需要,
url_for
允许你以编程方式控制生成的路径。 -
同样在
templates/hello_there.html
中,将<body>
元素的内容替换为以下标记,该标记使用message
样式而不是<strong>
标签(如果你仅使用没有名称的 hello/ URL,还会显示消息)。{%if name %} <span class="message">Hello there, {{ name }}!</span> It's {{ date.strftime("%A, %d %B, %Y at %X") }}. {% else %} <span class="message">What's your name? Provide it after /hello/ in the URL.</span> {% endif %}
-
运行应用程序,导航到 /hello/name URL,并观察消息以蓝色呈现。完成后停止应用程序。
从代码提供静态文件
-
在
static
文件夹中,创建一个名为data.json
的 JSON 数据文件,内容如下(这是无意义的示例数据)。{ "01": { "note": "This data is very simple because we're demonstrating only the mechanism." } }
-
在
app.py
中,添加一个带有路由 /api/data 的函数,该函数使用send_static_file
方法返回静态数据文件。@app.route("/api/data") def get_data(): return app.send_static_file("data.json")
-
运行应用程序并导航到 /api/data 端点,以查看返回的静态文件。完成后停止应用程序。
创建扩展基本模板的多个模板
由于大多数 Web 应用程序都有多个页面,并且这些页面通常共享许多常见元素,因此开发人员会将这些常见元素分离到一个基本页面模板中,其他页面模板可以扩展该基本页面模板(这也称为模板继承)。
此外,由于你可能会创建许多扩展同一模板的页面,因此在 VS Code 中创建一个代码片段会很有帮助,你可以使用该代码片段快速初始化新的页面模板。代码片段可帮助你避免繁琐且容易出错的复制粘贴操作。
以下各节将逐步介绍此过程的不同部分。
创建基本页面模板和样式
Flask 中的基本页面模板包含一组页面的所有共享部分,包括对 CSS 文件、脚本文件等的引用。基本模板还定义了一个或多个 块 标记,预期扩展基本模板的其他模板将覆盖这些标记。块标记在基本模板和扩展模板中都由 {% block <name> %}
和 {% endblock %}
分隔。
以下步骤演示如何创建基本模板。
-
在
templates
文件夹中,创建一个名为layout.html
的文件,内容如下,其中包含名为 “title” 和 “content” 的块。如你所见,标记定义了一个简单的导航栏结构,其中包含指向“主页”、“关于”和“联系人”页面的链接,你将在后面的部分中创建这些链接。每个链接再次使用 Flask 的url_for
标记在运行时为匹配的路由生成链接。<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='site.css')}}" /> </head> <body> <div class="navbar"> <a href="{{ url_for('home') }}" class="navbar-brand">Home</a> <a href="{{ url_for('about') }}" class="navbar-item">About</a> <a href="{{ url_for('contact') }}" class="navbar-item">Contact</a> </div> <div class="body-content"> {% block content %} {% endblock %} <hr/> <footer> <p>© 2018</p> </footer> </div> </body> </html>
-
将以下样式添加到
static/site.css
中,在现有的 “message” 样式下方,然后保存该文件。请注意,本演练不会尝试演示响应式设计;这些样式只是生成一个相当有趣的结果。.navbar { background-color: lightslategray; font-size: 1em; font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; color: white; padding: 8px 5px 8px 5px; } .navbar a { text-decoration: none; color: inherit; } .navbar-brand { font-size: 1.2em; font-weight: 600; } .navbar-item { font-variant: small-caps; margin-left: 30px; } .body-content { padding: 5px; font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
你现在可以运行该应用程序,但由于你尚未在任何地方使用基本模板,并且尚未更改任何代码文件,因此结果与上一步相同。完成其余部分以查看最终效果。
创建代码片段
由于你在下一节中创建的三个页面扩展了 layout.html
,因此创建一个 代码片段 以使用对基本模板的适当引用来初始化新模板文件可以节省时间。代码片段从单个源提供一致的代码片段,从而避免了在使用现有代码复制粘贴时可能出现的错误。
-
在 VS Code 中,选择 文件 > 首选项 > 配置用户代码片段。
-
在出现的列表中,选择 html。如果你之前创建过代码片段,则该选项可能会在列表的 现有代码片段 部分中显示为 “html.json”。
-
在 VS Code 打开
html.json
后,在现有花括号中添加以下条目(此处未显示的解释性注释描述了诸如$0
行如何指示 VS Code 在插入代码片段后放置光标的位置等详细信息)。"Flask Tutorial: template extending layout.html": { "prefix": "flextlayout", "body": [ "{% extends \"layout.html\" %}", "{% block title %}", "$0", "{% endblock %}", "{% block content %}", "{% endblock %}" ], "description": "Boilerplate template that extends layout.html" },
-
保存
html.json
文件(⌘S (Windows,Linux Ctrl+S))。 -
现在,每当你开始键入代码片段的前缀(例如
flext
)时,VS Code 都会将该代码片段作为自动完成选项提供,如下一节所示。你还可以使用 插入代码片段 命令从菜单中选择代码片段。
有关代码片段的更多信息,请参阅 创建代码片段。
使用代码片段添加页面
有了代码片段,你可以快速为“主页”、“关于”和“联系人”页面创建模板。
-
在
templates
文件夹中,创建一个名为home.html
的新文件,然后开始键入flext
以查看代码片段作为完成项出现。选择完成项后,代码片段的代码会显示在代码片段的插入点上,光标位于插入点上。
-
在“title”块的插入点,写入
Home
,在“content”块中,写入<p>Visual Studio Code Flask 教程的主页。</p>
,然后保存文件。这些行是扩展页面模板中唯一独特的部分。 -
在
templates
文件夹中,创建about.html
,使用代码片段插入样板标记,在“title”和“content”块中分别插入About us
和<p>Visual Studio Code Flask 教程的关于页面。</p>
,然后保存文件。 -
重复上一步,使用
Contact us
和<p>Visual Studio Code Flask 教程的联系页面。</p>
在两个内容块中创建templates/contact.html
。 -
在
app.py
中,为 /about/ 和 /contact/ 路由添加函数,这些函数分别引用它们各自的页面模板。同时修改home
函数以使用home.html
模板。# Replace the existing home function with the one below @app.route("/") def home(): return render_template("home.html") # New functions @app.route("/about/") def about(): return render_template("about.html") @app.route("/contact/") def contact(): return render_template("contact.html")
运行应用
所有页面模板都就位后,保存 app.py
,运行应用,并打开浏览器查看结果。在页面之间导航以验证页面模板是否正确扩展了基本模板。
注意: 如果您没有看到最新的更改,您可能需要在页面上进行硬刷新,以避免看到缓存的文件。
可选活动
以下部分描述了您在使用 Python 和 Visual Studio Code 时可能会发现有用的其他步骤。
为环境创建一个 requirements.txt 文件
当您通过源代码控制或其他方式共享应用代码时,复制虚拟环境中的所有文件是没有意义的,因为接收者总是可以自己重新创建环境。
因此,开发人员通常会从源代码控制中省略虚拟环境文件夹,而是使用 requirements.txt
文件来描述应用的依赖项。
虽然您可以手动创建文件,但也可以使用 pip freeze
命令根据激活的环境中安装的确切库来生成文件。
-
使用 Python: 选择解释器 命令选择您选择的环境后,运行 终端: 创建新终端 命令 (⌃⇧` (Windows, Linux Ctrl+Shift+`))),以打开一个已激活该环境的终端。
-
在终端中,运行
pip freeze > requirements.txt
以在您的项目文件夹中创建requirements.txt
文件。
任何接收项目副本的人(或任何构建服务器)只需要运行 pip install -r requirements.txt
命令即可重新安装原始环境中的包。(但是,接收者仍然需要创建自己的虚拟环境。)
注意:
pip freeze
列出您在当前环境中安装的所有 Python 包,包括您当前未使用的包。该命令还列出带有确切版本号的包,您可能希望将其转换为范围以在将来获得更大的灵活性。有关更多信息,请参阅 pip 命令文档中的 Requirements Files。
重构项目以支持进一步开发
在本 Flask 教程中,所有应用代码都包含在单个 app.py
文件中。为了允许进一步开发并分离关注点,将 app.py
的各个部分重构为单独的文件会很有帮助。
-
在您的项目文件夹中,为应用创建一个文件夹,例如
hello_app
,以将其文件与项目级别的其他文件(如requirements.txt
和 VS Code 存储设置和调试配置文件的.vscode
文件夹)分开。 -
将
static
和templates
文件夹移动到hello_app
中,因为这些文件夹肯定包含应用代码。 -
在
hello_app
文件夹中,创建一个名为views.py
的文件,其中包含路由和视图函数from flask import Flask from flask import render_template from datetime import datetime from . import app @app.route("/") def home(): return render_template("home.html") @app.route("/about/") def about(): return render_template("about.html") @app.route("/contact/") def contact(): return render_template("contact.html") @app.route("/hello/") @app.route("/hello/<name>") def hello_there(name = None): return render_template( "hello_there.html", name=name, date=datetime.now() ) @app.route("/api/data") def get_data(): return app.send_static_file("data.json")
-
在
hello_app
文件夹中,创建一个包含以下内容的__init__.py
文件import flask app = flask.Flask(__name__)
-
在
hello_app
文件夹中,创建一个包含以下内容的webapp.py
文件# Entry point for the application. from . import app # For application discovery by the 'flask' command. from . import views # For import side-effects of setting up routes.
-
打开调试配置文件
launch.json
并按如下方式更新env
属性以指向启动对象"env": { "FLASK_APP": "hello_app.webapp" },
-
删除项目根目录中原始的
app.py
文件,因为其内容已移动到其他应用文件中。 -
您的项目结构现在应该类似于以下内容
-
再次在调试器中运行该应用以确保一切正常。要在 VS Code 调试器之外运行该应用,请使用终端中的以下步骤
- 为
FLASK_APP
设置一个环境变量。在 Linux 和 macOS 上,使用export set FLASK_APP=webapp
;在 Windows 上,如果您使用的是 PowerShell,则使用$env:FLASK_APP=webapp
,或者如果您使用的是命令提示符,则使用set FLASK_APP=webapp
。 - 导航到
hello_app
文件夹中,然后使用python -m flask run
启动程序。
- 为
使用 Docker 扩展为 Flask 应用创建一个容器
Docker 扩展 可以轻松地从 Visual Studio Code 构建、管理和部署容器化应用程序。如果您有兴趣了解如何为本教程中开发的 Flask 应用创建 Python 容器,请查看 容器中的 Python 教程,它将引导您完成如何
- 创建描述简单 Python 容器的
Dockerfile
文件。 - 构建、运行和验证 Flask 应用的功能。
- 调试在容器中运行的应用。
如果你有任何问题,可以在 Python 扩展讨论问答 中搜索答案或提出问题。
后续步骤
恭喜您完成了本关于在 Visual Studio Code 中使用 Flask 的演练!
本教程中完成的代码项目可以在 GitHub 上找到:python-sample-vscode-flask-tutorial。
由于本教程仅涉及页面模板的表面,请参阅 Jinja2 文档 以获取有关模板的更多信息。模板设计器文档 包含有关模板语言的所有详细信息。您可能还想查看 官方 Flask 教程 以及 Flask 扩展的文档。
要在生产网站上试用您的应用,请查看教程 使用 Docker 容器将 Python 应用部署到 Azure 应用服务。Azure 还提供标准容器 Linux 上的应用服务,您可以从 VS Code 中将 Web 应用部署到该容器。
您可能还想查看 VS Code 文档中与 Python 相关的以下文章