应用设置

Flask 应用是 Flask 类的实例。关于这个应用的一切,比如配置和 URL,都会使用这个类注册。

创建一个 Flask 应用最直接的方式是直接在你的代码顶部创建一个全局的 Flask 实例,就像上一页的“Hello, World!”示例做的那样。虽然这在某些情况下很简单也很有用,但它在项目变大时会带来一些棘手的问题。

与其全局创建一个 Flask 类实例,不如在一个函数里创建它。这个函数被称为 应用工厂。应用所需要的任何配置、注册和其他设置都将在这个函数里进行,然后应用会被返回。

应用工厂

是时候开始写代码了!创建 flaskr 目录并添加 __init__.py 文件。__init__.py 有两个作用:它将包含应用工厂,而且告诉 Python,flaskr 目录应该被看做一个包。

$ mkdir flaskr
flaskr/__init__.py
import os

from flask import Flask


def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    if test_config is None:
        # load the instance config, if it exists, when not testing
        app.config.from_pyfile('config.py', silent=True)
    else:
        # load the test config if passed in
        app.config.from_mapping(test_config)

    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # a simple page that says hello
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

create_app 是应用工厂函数。你会在教程后面对它进行补充,不过它已经做了很多事情。

  1. app = Flask(__name__, instance_relative_config=True) 创建 Flask 实例。

    • __name__ 是当前 Python 模块的名称。为了设置一些路径,应用需要知道它的位置,而 __name__ 是告诉它当前位置的一个便捷方式。

    • instance_relative_config=True 用来告诉应用,配置文件的位置相对于 实例文件夹。实例文件夹位于 flaskr 包的外层,它用来存放不应该提交到版本控制软件的本地数据,比如包含私密信息的配置和数据库文件。

  2. app.config.from_mapping() 设置一些应用将会使用的默认配置:

    • SECRET_KEY 被 Flask 和扩展用来保持数据安全。为了方便,在开发时可以将它设为 'dev',但是它在部署时应该被一个随机值覆写。

    • DATABASE 是保存 SQLite 数据库文件的路径。它在 app.instance_path 路径下,这是 Flask 为实例文件夹选择的路径。你会在下一节了解到更多关于数据库的内容。

  3. 如果实例文件夹里存在 config.py 文件,app.config.from_pyfile() 会使用从这个文件中获取到的值来覆写默认配置。例如,当部署时,这可以被用来设置一个真正的 SECRET_KEY 配置值。

    • test_config 也可以传递给工厂函数,这时传入的测试配置会被使用,而不是实例文件夹内的配置。这样可以让你在稍后的教程中会编写的测试被独立配置,以区别于任何开发时使用的值。

  4. os.makedirs() 确保 app.instance_path 指向的路径存在。Flask 不会自动创建实例文件夹,但它需要被创建,因为你的项目将在那里创建 SQLite 数据库文件。

  5. @app.route() 创建了一个简单的路由,这样在开始下面的教程之前你可以看到应用能够正常工作。它在 URL /hello 和一个函数之间创建了一个连接,这个函数会返回一个响应,在这里即 'Hello, World!' 字符串。

运行应用

现在你可以用 flask 命令运行应用。在终端里告诉 Flask 要去哪里找到你的应用,然后以开发模式运行它。请记住,你应该仍然在顶层的 flask-tutorial 目录下,而不是 flaskr 包内。

在开发模式下,每当页面抛出一个异常时,就会显示一个交互式的调试器(debugger);每当你对代码进行修改,就会重启服务器。在接下来的教程中,你可以让它保持运行,只需要重载浏览器页面。

$ export FLASK_APP=flaskr
$ export FLASK_ENV=development
$ flask run

你会看到类似下面的输出:

* Serving Flask app "flaskr"
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 855-212-761

在浏览器中访问 http://127.0.0.1:5000/hello,你应该会看到“Hello, World!”信息。恭喜,你现在正在运行你的 Flask web 应用!

If another program is already using port 5000, you’ll see OSError: [Errno 98] or OSError: [WinError 10013] when the server tries to start. See Address already in use for how to handle that.

继续阅读 定义并访问数据库