HTTP/1.1 在 Shiny python 中读取外部 js 和 css 文件时未找到 404

问题描述 投票:0回答:1

问题

这是使用 Shiny.py,而不是 R Shiny。请参阅此处查看shiny.py 存储库。

我收到一条错误消息

"GET /script.js HTTP/1.1" 404 Not Found
。这是我根据本文档
这里
使用ui.head_content(ui.include_js(js_file))的时候。我正在与
ui.include_css()
一起使用它。

代表:

应用程序.py

from shiny import App, render, ui
from htmltools.tags import div, script
from pathlib import Path

css_file = Path(__file__).parent / "www" / "stylesheet.css"
js_file = Path(__file__).parent / "www" / "script.js"

app_ui = ui.page_fluid(
    ui.head_content(ui.include_js(js_file)),
    ui.head_content(ui.include_css(css_file)),
    div(
        {"class": "redbkg"},
        ui.h2("Hello Shiny!"),
        ui.input_slider("n", "N", 0, 100, 20),
        ui.output_text_verbatim("txt")
    )
)


def server(input, output, session):
    @output
    @render.text
    def txt():
        return f"n*2 is {input.n() * 2}"


app = App(app_ui, server)

样式表.css

.redbkg{
    background-color: rgb(241, 201, 201);
}

脚本.js

document.body.style.backgroundColor = "skyblue";

网络读取script.js

我在 this 资源之后尝试了一些其他操作,并使用 htmltools

script
来复制我通常在 R 中执行的操作(即正文之后的
script(src="script.js")
)。您可以在here查看 py-htmltools 的存储库。但是,我不断收到同样的错误。这可能是一个更广泛的问题,因为 css 文件单独工作,但 js 文件单独似乎不会影响任何东西(即使它在网络中被正确读取)。

starlette vs wasm?

我注意到在 Shiny py 存储库中有一个名为 http_staticfiles.py 的 file。其中写道:

在wasm模式下运行时我们不能使用starlette的StaticFiles, 因为它启动了一个线程。相反,使用我们自己的蹩脚版本。 幸运的是,这就是我们所需要的。

在本机Python模式下运行时,使用starlette StaticFiles 暗示;它经过了战斗考验,而我们的则没有。在 wasm 下,如果 我们的有错误,甚至安全漏洞:一切都在运行 浏览器沙箱包括文件系统,所以我们无能为力 披露攻击者尚无法访问。相同的是 在本机 Python 中运行时并非如此,我们希望像 有可能。

我想知道这是否是问题的提示,但不确定如何继续。

有人对这个问题有任何见解吗?

javascript python webassembly starlette py-shiny
1个回答
0
投票

这是一个错误,已由 Joe Cheng 确认。该问题在 github

上提出

当前的解决方法是:

  1. 将文件放在单独的目录中,然后将
    defer=""
    添加到
    include_js()
    调用
  2. 或者,将 method="inline" 添加到
    include_js()
    调用中。
© www.soinside.com 2019 - 2024. All rights reserved.