Flask提供自包含的静态项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>标签似乎有效,但对我来说感觉很烦。我想找一个更“正确”的解决方案。

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

答案

据我所知,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服务器。

以上是关于Flask提供自包含的静态项目的主要内容,如果未能解决你的问题,请参考以下文章

Flask之模板之宏继承包含

Flask:如何提供静态 html?

支持动态或静态片段的不同屏幕尺寸?

在片段中使用列表视图

Python使用Flask框架,结合Highchart,自定义导出菜单项目及顺序

flask自定义模板