Flask教程-Hello, Flask!
在Flask中编写主页
在这一章中,我们的主要任务是为我们的程序编写一个简单的主页。主页的URL通常是根地址,即/
。当用户访问根地址时,我们需要返回一行欢迎文字。下面是编写这个任务所需的代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Welcome to My Watchlist!'
按照惯例,将上述代码保存为app.py
。确保当前目录是项目的根目录,并且已激活虚拟环境。然后,在命令行窗口中执行flask run
命令来启动程序(按下Ctrl + C可以退出):
(env) $ flask run
* Serving Flask app "app.py"
* 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)
现在打开浏览器,输入http://localhost:5000
并按下Enter键,即可访问我们的程序主页,并看到我们在程序中返回的欢迎语。
当我们执行flask run
命令时,Flask会使用内置的开发服务器来运行我们的程序。这个服务器默认监听本地机的5000端口。因此,我们可以通过在浏览器的地址栏中输入http://127.0.0.1:5000
或者http://localhost:5000
来访问我们的程序。
127.0.0.1
是本地回环地址,也被称为"localhost",用于访问本地计算机上的网络服务。而5000是Flask开发服务器默认的监听端口。
现在来解释一下这段代码的作用和执行流程:
首先,我们导入了Flask类来创建一个Flask应用程序对象:
from flask import Flask
app = Flask(__name__)
然后,我们使用@app.route()
装饰器将一个函数注册为处理根地址("/")请求的视图函数:
@app.route('/')
def hello():
return 'Welcome to My Watchlist!'
这个hello()
函数是一个视图函数,它处理根地址的请求。当用户在浏览器中访问根地址时,Flask会调用这个函数来处理请求,并将函数的返回值作为响应发送回客户端浏览器。
执行流程如下:
- 当用户在浏览器中访问
http://localhost:5000/
时,浏览器向Flask应用程序发送一个GET请求。 - Flask应用程序接收到请求后,根据注册的URL规则发现匹配的是根地址("/")。
- 然后,Flask调用
hello()
函数来处理请求。 hello()
函数返回一个简单的欢迎消息作为响应。- Flask应用程序将该响应发送回浏览器,浏览器将其显示在窗口中。
这样,我们就实现了一个最简单的Flask程序,提供了一个欢迎页面。
Flask程序发现机制
Flask通过读取环境变量FLASK_APP
的值来确定要运行的程序实例。你可以将FLASK_APP
设置为以下值之一:
- 模块名:如果你的程序保存为一个模块文件(例如
hello.py
),你可以将FLASK_APP
设置为该模块的名称。 - Python导入路径:如果你的程序文件不在当前目录或Python的模块搜索路径中,你可以将
FLASK_APP
设置为文件的导入路径。例如,如果程序文件在/path/to/myapp/hello.py
,你可以将FLASK_APP
设置为myapp.hello
。 - 文件目录路径:如果你的程序是以目录形式组织的,你可以将
FLASK_APP
设置为该目录的路径。Flask将尝试在指定的目录中查找名为app.py
或wsgi.py
的文件作为程序入口。
以下是设置FLASK_APP
环境变量的示例命令:
在Linux或Mac上:
$ export FLASK_APP=hello.py
在Windows CMD中:
> set FLASK_APP=hello.py
在Windows PowerShell中:
> $env:FLASK_APP = "hello.py"
请注意,这些命令只是设置了当前会话中的FLASK_APP
环境变量,如果你重新打开一个新的终端会话,需要再次设置FLASK_APP
。
如何管理环境变量?
在启动 Flask 程序时,通常需要管理两个环境变量:FLASK_APP
和FLASK_DEBUG
。
FLASK_APP
用于指定要运行的程序实例。在之前的回答中已经提到了如何设置FLASK_APP
环境变量。FLASK_DEBUG
用于开启调试模式。当调试模式开启时,如果程序出错,错误信息将显示在浏览器页面上;同时,如果代码发生变动,程序会自动重载。你可以手动设置FLASK_DEBUG
环境变量来开启调试模式。下面是设置FLASK_DEBUG
环境变量的示例命令:
在Linux或Mac上:
$ export FLASK_DEBUG=1
在Windows CMD中:
> set FLASK_DEBUG=1
在Windows PowerShell中:
$env:FLASK_DEBUG = "1"
为了避免每次打开新的终端会话都要手动设置环境变量,你可以使用python-dotenv
库自动导入系统环境变量。以下是使用python-dotenv
的步骤:
安装python-dotenv
库:
(env) $ pip install python-dotenv
创建.flaskenv
和.env
文件: 使用文本编辑器创建这两个文件,或者使用touch
命令在终端中创建:
$ touch .flaskenv .env
.flaskenv
文件用于存储与Flask命令行系统相关的公开环境变量。.env
文件用于存储敏感数据,不应提交到版本控制中。
编辑.flaskenv
和.env
文件: 打开.flaskenv
文件,添加以下内容以设置FLASK_DEBUG=1
:
FLASK_DEBUG=1
.flaskenv
和.env
文件位于项目根目录中。
注意:为了保护敏感数据,.env
文件应添加到.gitignore
文件中,以避免提交到Git仓库中。
现在,当你启动Flask程序时,它将自动从.flaskenv
和.env
文件中读取环境变量并进行设置。
另外,如果你安装的是Flask 2.3或更高版本,你可以直接使用--debug
命令行选项来开启调试模式,而不需要设置FLASK_DEBUG
环境变量。示例命令如下:
(env) $ flask run --debug
修改视图函数的返回值
你可以自由修改视图函数的返回值。例如,你可以返回一个包含HTML元素标记的字符串,如:
@app.route('/')
def hello():
return '<h1>Hello Totoro!</h1><img src="http://helloflask.com/totoro.gif">'
保存修改后,刷新浏览器页面,你将看到页面上的内容随之变化。
修改URL规则
你也可以自由修改传递给app.route
装饰器的URL规则字符串,但注意URL规则字符串必须以斜线/
开头。例如:
@app.route('/home')
def hello():
return 'Welcome to My Watchlist!'
保存修改后,刷新浏览器页面,你将看到一个404错误提示,表示页面未找到(Page Not Found)。这是因为视图函数的URL规则更改为/home
,而我们刷新的地址仍然是旧的/
。如果将访问地址更改为http://localhost:5000/home
,你将正确看到返回值。
一个视图函数也可以绑定多个URL,通过添加多个装饰器来实现。例如:
@app.route('/')
@app.route('/index')
@app.route('/home')
def hello():
return 'Welcome to My Watchlist!'
现在,无论你访问http://localhost:5000/
、http://localhost:5000/home
还是http://localhost:5000/index
,都可以看到相同的返回值。
此外,在URL中定义变量部分也是可能的。例如,下面的视图函数将处理类似/user/<name>
的所有请求:
@app.route('/user/<name>')
def user_page(name):
return 'User page'
无论你访问http://localhost:5000/user/greyli
、http://localhost:5000/user/peter
还是http://localhost:5000/user/甲
,都会触发这个函数。你可以在视图函数中通过参数name
获取到这个变量的值。
注意:由于用户输入的数据可能包含恶意代码,所以不能直接作为响应返回。在返回响应时,需要使用MarkupSafe
库中提供的escape()
函数对name
变量进行转义处理,以防止浏览器将其作为代码执行。
修改视图函数名
视图函数的名称是自由定义的,和URL规则无关。它还充当代表某个路由的端点(endpoint),同时用于生成视图函数对应的URL。为了避免手动编写URL,Flask提供了url_for
函数用于生成URL,它的第一个参数默认为视图函数的名称。
例如,你可以使用以下代码生成URL:
from flask import url_for
from markupsafe import escape
# ...
@app.route('/')
def hello():
return 'Hello'
@app.route('/user/<name>')
def user_page(name):
return f'User: {escape(name)}'
@app.route('/test')
def test_url_for():
print(url_for('hello')) # 生成 hello 视图函数对应的 URL,将会输出:/
print(url_for('user_page', name='greyli')) # 输出:/user/greyli
print(url_for('user_page', name='peter')) # 输出:/user/peter
print(url_for('test_url_for')) # 输出:/test
print(url_for('test_url_for', num=2)) # 输出:/test?num=2
return 'Test page'
在上述代码中,通过调用url_for
函数,你可以生成与特定视图函数相关的URL。
这里编写的代码可以删除或保留,但请确保为根地址返回一行问候语。
总结
本章我们为程序编写了主页,并学习了 Flask 视图函数的基本编写方式。在结束之前,让我们提交代码:
$ git add .
$ git commit -m "Add minimal home page"
$ git push
为了保持简单,我们在章节的最后一次提交中包含了所有的改动。在实际情况中,通常会根据需要进行多个提交。同样地,我们使用了-m
参数来提供简单的提交信息。在实际情况中,你可能需要编写更完整的提交信息。
提示:
- 对于URL变量,Flask支持在URL规则字符串中为变量设置处理器,对变量进行预处理。例如,
/user/<int:number>
将URL中的number
部分转换为整数。 - 由于Flask的上下文机制,某些变量和函数(例如
url_for
函数)只能在特定的情况下正确执行,例如在视图函数内部。我们暂时不必担心这些问题,在后面的学习中会逐渐了解。 - 以
.
开头的文件名默认被视为隐藏文件,在执行ls
命令时不会显示它们。你可以使用ls -a
命令来显示所有文件,包括隐藏文件。