Skip to content

flask 项目配置

静态文件配置

一个完整的⽹站当然不能只返回用户一句 Hello World !,我们需要模板(template)和静态文件(static file)来生成更加丰富的⽹页。

模板 即包含程序页面的 HTML 文件,静态文件 则是需要在 HTML 文件中加载的 CSS 和 JavaScript 文件,以及图⽚、字体文件等资源文件。

默认情况下,模板文件存放在项目根目录中的 templates 文件夹中,静态文件存放在 static 文 件夹下,这两个文件夹需要和包含程序实例的模块处于同一个目录下,对应的项目结构示例如下所示:

application/
	- templates/ 
	- static/ 
	- app.py

初始化参数

Flask 程序实例在创建的时候,需要默认传入当前 Flask 程序所指定的包(模块),接下来就来详细查看一下 Flask 应用程序在创建的时候一些需要我们关注的参数:

  • import_name
    • Flask 程序所在的包(模块),传 __name__ 就可以
    • 其可以决定 Flask 在访问静态文件时查找的路径
  • static_folder
    • 静态文件存储的文件夹,可以不传,默认为 static
  • template_folder
    • 模板文件存储的文件夹,可以不传,默认为 templates
python
# 初始化 Flask 应用程序,并指定当前程序所处于的包名
from flask import current_app, Flask, render_template

app = Flask(
    __name__,
    static_folder='static',  # 静态文件所在的文件夹名,默认为 static
    template_folder='templates',  # 模板文件所在的文件夹名,默认为 templates
)

配置文件加载

在 Flask 程序运行的时候,可以给 Flask 设置相关配置,比如:配置数据库连接地址等等,设置 Flask 配置有以下四种方式:

1、从配置对象中加载(常用)

python
app.config.form_object()

2、从配置文件中加载

python
app.config.form_pyfile()

3、从环境变量中加载(了解)

python
app.config.from_envvar()

下面演示如何从对象中加载配置文件

python
class TestConfig:
    SECRET_KEY = "测试秘钥"


# app.secret_key = '使用app对象进行配置秘钥'
# app.config['SECRET_KEY'] = '使用配置文件进行配置秘钥'
# app.config.from_object(TestConfig)
app.config.from_pyfile('config.py')

自定义 flask 命令

除了 Flask 内置的 flask run 等命令,我们也可以自定义命令。在虚拟环境安装 Flask 后,包含许多内置命令的 flask 脚本就可以使用了。在前面我们 已经接触了很多 flask 命令,比如运行服务器的 flask run,启动 shell 的 flask shell。

通过创建任意一个函数,并为其添加 app.cli.command() 装饰器,我们就可以注册一个 flask 命令。下方代码创建了一个自定义的 hello() 命令函数,在函数中我们仍然只是打印一行问候。

创建自定义命令

python
import click


@app.cli.command()
def hello():
    click.echo('Hello, flask!')

函数的名称即为命令名称,这里注册的命令即 hello ,你可以使用 flask hello 命令来触发函数。作为替代,你也可以在 app.cli.command() 装饰器 中传入参数来设置命令名称,比如 app.cli.command('say-hello') 会把命令 名称设置为 say-hello, 完整的命令即 flask say-hello 。

借助 click 模块的 echo() 函数,我们可以在命令行界面输出字符。 命令函数的文档字符串则会作为帮助信息显示(flask hello --help)。 在命令 行下执行 flask hello 命令就会触发这个 hello() 函数:

shell
$ flask hello 
Hello, flask!

在命令下执行 flask --help 可以查看 Flask 提供的命令帮助文档,我们自定义的 hello 命令也会出现在输出的命令列表中,如下所示:

$ flask
Usage: flask [OPTIONS] COMMAND [ARGS]...

  A general utility script for Flask applications.

  Provides commands from Flask, extensions, and the application. Loads the
  application defined in the FLASK_APP environment variable, or from a
  wsgi.py file. Setting the FLASK_ENV environment variable to 'development'
  will enable debug mode.

    > set FLASK_APP=hello.py
    > set FLASK_ENV=development
    > flask run

Options:
  --version  Show the flask version
  --help     Show this message and exit.

Commands:
  hello   自己定义的指令
  routes  Show the routes for the app.
  run     Runs a development server.
  shell   Runs a shell in the app context.

关于自定义命令更多的设置和功能请参考 Click 的官方文档 :https://click.palletsprojects.com/en/6.x/

拓展 @Flask 与 MVC 架构

MVC 架构最初是用来设计桌面程序的,后来也被用于 Web 程序,应用 了这种架构的 Web 框架有 Django、Ruby on Rails 等。

在 MVC 架构中,程序被分为三个组件:数据处理(Model)、用户界面(View)、交互逻辑 (Controller)。 严格来说,Flask 并不是 MVC 架构的框架,因为它没有内置数据模型⽀持。为了方便表述,在教程中使用app.route() 装饰器的函数仍被称为视图函数, 同时会使用 <函数名>-视图(比如 index 视图)的形式来代指某个视图函数。

如果想要使用 Flask 来编写一个 MVC 架构的程序,那么视图函数可以作为控制器(Controller),视图(View)则是将要学习的使用 Jinja2 渲染的 HTML 模板,而模型(Model)可以使用其他库来实现,用 SQLAlchemy 来创建数据库模型。