我有几个已经完成的,自包含的静态项目,我想与Flask一起服务。我的项目目录看起来像:
- flask
- flaskr.py
- projects
- project1
- index.html
- css.css
- js.js
- project2
- ...
- ...
我试过只是send_static_file
我的index.html
:
@app.route('/proj1')
def proj1():
return app.send_static_file("projects/index.html")
然而,它对css.css
和js.js
的引用然后指向/css.css
和/js.js
而不是/projects/project1/css.css
和/projects/project1/js.js
。
我还试图在调用app.root_path
之前修改send_static_file
,然后在之后重置它,但这总是导致404。
在<base href="/projects/project1/">
之后插入<head>
标签似乎有效,但对我来说感觉很烦。我想找一个更“正确”的解决方案。
我怎样才能做到这一点?我不想修改项目中的任何代码;它应该尽可能拖放。
据我所知,send_static_file
只发送一个静态文件,它不会重写或任何东西。因此文件到达文件系统上的客户端。
浏览器获取/proj1
并获取一个HTML文件,上面写着“还下载css.css
并将其添加到此文档中”。浏览器不知道HTML文件最初位于/projects/project1/index.html
,它只知道它访问了/proj1
。因此它查找相对于它访问的文件的css.css
文件,因此它查找/css.css
。
如果你通过index.html
(或任何其他位于/projects/project1/index.html
的路径)服务/projects/project1/
,相对查找将导致/projects/project1/css.css
。
在my other answer中,我概述了为什么会出现这个问题并提出一个解决方案,以便浏览器可以推断出资源的正确位置。另一种可能性是烧瓶找出浏览器实际需要的资源。 “通常”浏览器发送带有请求的referer header(虽然有例外),我们可以用它来推断出css.css
的意思:
from flask import request
@app.route('/css.css')
def css():
r = request.referrer
if r.endswith("proj1"):
app.send_static_file("projects/project1/css.css")
这非常hacky,我个人不推荐它,基本上你要么必须硬编码项目或实现一些注册来自动化。
正如@ jpmc26所述,从一开始就存在问题。 Flask应该用于动态站点,并且过度杀伤并且不适合这种用例。相反,建议使用像Nginx这样的Web服务器。如果需要动态内容,Nginx将能够将请求路由到子Flask服务器。