Flask 在部署时更新路径

Flask 在部署时更新路径,flask,routes,mod-wsgi,wsgi,Flask,Routes,Mod Wsgi,Wsgi,我一直在使用开发服务器开发一个flask应用程序。现在我已经准备好将它部署到另一台机器上(上面已经有很多其他东西),我正在学习如何使用mod_wsgi连接到apache(已经在服务器上运行了)。我希望我的整个flask应用程序位于类似/mysite的路径下。我知道我可以使用WSGIScriptAlias来表示前缀,并在这个前缀路径之后发送所有内容 这对于使所有路由按预期运行非常有效,但是我的HTML/css/javascript文件呢?如果我引用HTML文件中的路径,我必须更改它吗?或者有什么方

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

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

我担心我可能会被改写很多

谢谢,
Jack

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

小型应用程序蓝图的真正好处是,如果你只有一个与你的应用程序关联的Blueprint对象,你可以简单地声明该蓝图的url前缀,它会将前缀应用到你应用程序中的每个路由

这里有一个非常简单的例子来说明这个概念

文件结构

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

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

导入操作系统
从烧瓶导入烧瓶、蓝图、jsonify、url_
#处理配置的方法有一百万种,
#对于本例,这只是为了简单起见。
配置=dict(
发展=口述(
环境与发展,
应用程序_ROOT='/',
),
生产=口述(
环境与生产,
应用程序_ROOT='/mysite/',
),
)
#基于环境获取配置
config\u key=os.getenv('FLASK\u config','development')
config\u dict=configuration[config\u key]
app=Flask(\uuuuu name\uuuuuuu,static\u url\u path=config\u dict['APPLICATION\u ROOT']))
app.config.update(配置目录)
bp=蓝图('myapp',名称)
@bp.route(“/”)
def index():
返回jsonify(message='hello from root!')
@bp.route(“/foo”)
def foo():
path=url\u表示('static',filename='index.js')
返回jsonify(path=path)
#将路由附加到应用程序
app.register\u blueprint(bp,url\u prefix=app.config['APPLICATION\u ROOT'])
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run()
你可能习惯看到的最大变化是 -我们使用的是
@bp.route
而不是
@app.route
,这样我们的路径就可以相对于url前缀自动设置 -为了让Flask能够找到我们的路线,我们必须采取另一个步骤
app.register_blueprint()
(没有这个,你只能得到404条)

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

localhost:5000

{"message": "hello from root!"}
当我们访问
/foo
路径时,我们会收到以下响应,告诉我们javascript文件的位置

localhost:5000/foo

{"path":"/index.js"}
{"path":"/mysite/index.js"}
在那里导航,我们实际上看到了文件的内容

localhost:5000/index.js

console.log('hello from static!);
之前,由于我们没有设置环境变量
FLASK\u CONFIG
,我们的应用程序默认使用我们的开发设置。现在让我们看看当我们设定这个值时会发生什么,就像我们在生产中一样

$export FLASK\u CONFIG=生产
现在,导航到前面的根路由返回404,因此我们改为使用生产url前缀

localhost:5000/mysite

{"message": "hello from root!"}
导航到我们的
/foo
路径以查看静态文件的位置

localhost:5000/mysite/foo

{"path":"/index.js"}
{"path":"/mysite/index.js"}
最后,导航到该路径实际上会显示我们的javascript文件

localhost:5000/mysite/index.js

console.log('hello from static!);
如果您希望在url中使用其他内容作为静态资产的前缀,甚至可能只是
/static/
,那么您所要做的就是在
app.py

#来自此
app=Flask(\uuuuu name\uuuuuuu,static\u url\u path=config\u dict['APPLICATION\u ROOT']))
#对此
app=Flask(uuuu name,static,url,path=config,dict['APPLICATION\u ROOT']+'static/'))
例如,现在您的路径看起来像
localhost:5000/static/index.js

最后,为了解决必须更改HTML文件中路径的问题:您可以使用与
foo
路径中演示的相同的
url\u for()
函数来引用蓝图中的任何位置。诀窍是引用路由的函数名,因此如果要创建指向
foo()
的链接,可以使用
url\u作为('bp.foo')
,其中
'bp'
Blueprint
函数中使用的字符串


我知道这是很多信息,但这个概念在我第一次学习的时候很难理解,所以我正在努力帮助别人避免头痛。干杯

如果有人想知道…我只是做了所有的重写。这是一个相对较小的应用程序,所以它不是最差的。不过,我还是很想找到更好的方法。谢谢你的回答。非常全面。在开始阅读时,我并不认为它能回答我的问题,但到最后,我看到了它是如何回答的。这有点棘手!