部署后的 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
函数中使用的字符串。
我知道这是很多信息,但是当我第一次学习这个概念时,我很难理解这个概念,所以我试图帮助其他人免于头痛。干杯!
我一直在使用开发服务器开发一个烧瓶应用程序。现在我已经准备好将它部署到另一台机器上(上面已经有很多其他东西),我正在学习如何使用 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
函数中使用的字符串。
我知道这是很多信息,但是当我第一次学习这个概念时,我很难理解这个概念,所以我试图帮助其他人免于头痛。干杯!