部署后的 Flask 更新路径

Flask Update paths upon deployment

我一直在使用开发服务器开发一个烧瓶应用程序。现在我已经准备好将它部署到另一台机器上(上面已经有很多其他东西),我正在学习如何使用 mod_wsgi 连接到 apache(已经是 运行 在服务器上。)我希望我的整个 Flask 应用程序位于像 /mysite 这样的路径下。我知道我可以使用 WSGIScriptAlias 来表示前缀并在此前缀路径之后发送烧瓶中的所有内容。

这对于使所有路由按预期运行非常有效,但是 我的 HTML/css/javascript 文件呢? 如果我引用 HTML 中的路径文件,我必须改变它吗?或者有什么方法可以更全面地解决这个问题?

我担心我可能需要大量重写...

谢谢, 杰克

蓝图允许您以非常模块化的方式构建应用程序,而且还具有为每组路由声明特定 url 前缀的好处。这在大型应用程序中非常方便,因为您可以 相对地 指定路由路径,而不必更新 所有路由,如果您的 url 结构更改,您只需更新该蓝图的前缀 。我稍微简化了一点,但您可以阅读更多有关这种结构化应用程序模式的信息 here

蓝图对于 较小的 应用程序的真正好处是,如果您只有一个蓝图对象与您的应用程序相关联,您可以简单地声明 url 前缀该蓝图,它会将前缀应用于您应用中的每条路线!

这是一个非常简单的例子来演示这个概念

File structure

.
├── app.py
└── static
    └── index.js

index.js

console.log('hello from static!');

app.py

import os
from flask import Flask, Blueprint, jsonify, url_for
# there are a million ways to handle configuration,
# this is just for simplicity's sake for this example.
configuration = dict(
    development = dict(
        ENV='development',
        APPLICATION_ROOT='/',
    ),
    production=dict(
        ENV='production',
        APPLICATION_ROOT='/mysite/',
    ),
)
# get configuration based on environment
config_key = os.getenv('FLASK_CONFIG', 'development')
config_dict = configuration[config_key]
app = Flask(__name__, static_url_path=config_dict['APPLICATION_ROOT'])
app.config.update(config_dict)
bp = Blueprint('myapp', __name__)

@bp.route('/')
def index():
    return jsonify(message='hello from root!')

@bp.route('/foo')
def foo():
    path = url_for('static', filename='index.js')
    return jsonify(path=path)

# attach your routes to the application
app.register_blueprint(bp, url_prefix=app.config['APPLICATION_ROOT'])

if __name__ == '__main__':
    app.run()

与您可能习惯看到的相比,最大的变化是 - 我们使用 @bp.route 而不是 @app.route,这样我们的路径可以自动设置为相对于我们的 url 前缀 - 我们必须采取额外的步骤 app.register_blueprint() 以便 Flask 能够找到我们的路线(没有这个,你只会得到 404's)

当我们运行 python3 app.py(或者,flask run)并导航到常规根路由/时,我们收到消息。

localhost:5000

{"message": "hello from root!"}

当我们访问 /foo 路由时,我们会收到以下响应,告诉我们 javascript 文件所在的位置

localhost:5000/foo

{"path":"/index.js"}

导航到那里,我们确实看到了文件的内容

localhost:5000/index.js

console.log('hello from static!);

以前,由于我们没有设置环境变量 FLASK_CONFIG,我们的应用默认使用 development 设置。现在让我们看看当我们设置该值时会发生什么,就像我们在生产中一样

$ export FLASK_CONFIG=production

现在,导航到我们之前的根路由 returns 一个 404,所以我们改为转到我们的生产 url 前缀

localhost:5000/mysite

{"message": "hello from root!"}

导航到我们的 /foo 路由以查看我们的静态文件所在的位置

localhost:5000/mysite/foo

{"path":"/mysite/index.js"}

最后,导航到该路径确实会显示我们的 javascript 文件

localhost:5000/mysite/index.js

console.log('hello from static!);

如果您希望在 url 中使用其他内容作为静态资产的前缀,甚至可能只是 /static/<your-file>,您所要做的就是更改 [=23] 中的这一行=]

# from this
app = Flask(__name__, static_url_path=config_dict['APPLICATION_ROOT'])

# to this
app = Flask(__name__, static_url_path=config_dict['APPLICATION_ROOT']+'static/')

例如,现在您的路径看起来像 localhost:5000/static/index.js

最后,为了解决您对必须更改 HTML 文件中的路径的担忧:您可以使用与 foo 路由中演示的相同 url_for() 函数来引用蓝图中的任何位置。诀窍是引用 路由的函数名称 ,所以如果你想创建一个 link 到 foo(),你可以使用 url_for('bp.foo'),其中 'bp'Blueprint 函数中使用的字符串。

我知道这是很多信息,但是当我第一次学习这个概念时,我很难理解这个概念,所以我试图帮助其他人免于头痛。干杯!