我想为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>
标记似乎可行,但对我来说却很棘手。我想找到一个更“正确”的解决方案。
我该如何实现?我不想在项目中修改任何代码。它应该尽可能地可拖放。
答案 0 :(得分:1)
据我所知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
。
答案 1 :(得分:1)
在my other answer中,我概述了为什么会发生此问题,并提出了解决方案,以便浏览器可以推断资源的正确位置。 flask的另一种可能性是找出浏览器实际需要的资源。浏览器“通常”向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")
这是非常棘手的,我个人不建议这样做,从本质上讲,您必须对项目进行硬编码或实施一些注册以使其自动化。
答案 2 :(得分:0)
正如@ jpmc26所指出的,从一开始,这个问题是错误的。 Flask应该用于动态站点,既过分使用也不适合此用例。相反,建议使用像Nginx这样的Web服务器。如果需要动态内容,Nginx将能够将请求路由到子Flask服务器。