独立静态项目

2024-06-14 22:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个已经完成,自我包含的静态项目,我想与烧瓶服务。我的项目目录类似于:

- 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。你知道吗

我还尝试在调用send_static_file之前修改app.root_path,然后重置它,但这总是导致404。你知道吗

<head>后面插入一个<base href="/projects/project1/">标记似乎很管用,但我觉得很不舒服。我想找到一个更“正确”的解决办法。你知道吗

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


Tags: 项目目录sendappindex烧瓶htmljs
3条回答

据我所知send_static_file只发送一个静态文件,它不进行重写或任何操作。因此,文件到达客户端时与文件系统上的文件一样。你知道吗

浏览器得到/proj1并得到一个HTML文件,上面写着“还可以下载css.css并将其添加到此文档”。浏览器不知道HTML文件最初驻留在/projects/project1/index.html,它只知道它被访问了/proj1。因此它查找相对于它访问的文件的css.css文件,因此它查找/css.css。你知道吗

如果通过/projects/project1/index.html(或/projects/project1/中的任何其他路径)为index.html提供服务,则相对查找将导致/projects/project1/css.css。你知道吗

正如@jpmc26所说,这个问题一开始就错了。烧瓶应该用于动态站点,并且是过度杀戮的,不适合这个用例。相反,建议使用像Nginx这样的web服务器。如果需要动态内容,Nginx将能够将请求路由到子服务器。你知道吗

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")

这是相当黑客和个人我不建议它,基本上你要么硬编码的项目或实现一些注册自动化。你知道吗

相关问题 更多 >