在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会调用这个函数来处理请求,并将函数的返回值作为响应发送回客户端浏览器。

执行流程如下:

  1. 当用户在浏览器中访问http://localhost:5000/时,浏览器向Flask应用程序发送一个GET请求。
  2. Flask应用程序接收到请求后,根据注册的URL规则发现匹配的是根地址("/")。
  3. 然后,Flask调用hello()函数来处理请求。
  4. hello()函数返回一个简单的欢迎消息作为响应。
  5. 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.pywsgi.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_APPFLASK_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/greylihttp://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命令来显示所有文件,包括隐藏文件。

标签: flask教程, flask技术, flask学习, flask学习教程, flask下载, flask开发, flask入门教程, flask进阶教程, flask高级教程, flask面试题, flask笔试题, flask编程思想