Flask服务独立的静态项目

时间:2018-09-28 16:07:19

标签: python python-3.x flask

我想为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.cssjs.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>标记似乎可行,但对我来说却很棘手。我想找到一个更“正确”的解决方案。

我该如何实现?我不想在项目中修改任何代码。它应该尽可能地可拖放。

3 个答案:

答案 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服务器。