首页 > 解决方案 > 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")

但是,它对 and 的引用指向css.cssand而不是and 。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>我想找到一个更“正确”的解决方案。

我怎样才能做到这一点?我不想修改项目中的任何代码;它应该尽可能可拖放。

标签: pythonpython-3.xflask

解决方案


据我所知send_static_file只发送一个静态文件,它不会重写或任何东西。所以文件到达客户端,就像它在文件系统上一样。

浏览器/proj1获取并获取一个 HTML 文件,上面写着“同时下载css.css并将其添加到此文档中”。浏览器不知道 HTML 文件最初位于/projects/project1/index.html,它只知道它被访问过/proj1。所以它会查找与css.css它访问的文件相关的文件,所以它会查找/css.css.

如果您提供index.htmlvia /projects/project1/index.html(或驻留在 中的任何其他路径/projects/project1/),则相对查找将导致/projects/project1/css.css.


推荐阅读