运行 JS 脚本的 Django 需要返回 Not Found 的 JSON(静态收集)

Posted

技术标签:

【中文标题】运行 JS 脚本的 Django 需要返回 Not Found 的 JSON(静态收集)【英文标题】:Django running a JS script that requires a JSON returning Not Found (static collected) 【发布时间】:2020-01-23 23:39:09 【问题描述】:

免责声明:我对 javascript 知之甚少

我正在尝试在 Django 实例中运行 TensorflowJS,我可以成功加载 JS 以调用 tf.loadLayersModel 函数,但是该函数需要一个 json 文件(以及稍后的另一个 .bin 文件)才能运行并且该函数无法找到它。

这两个文件(json 和 bin)都在预期的静态目录中(与首先加载 JS 文件相同),但每次我加载页面时 Django 返回 Not Found: /myapp/test_model/model.json 并且浏览器返回(通过 Inspect Element )Error: Request to model.json failed with status code 404. Please verify this URL points to the model JSON of the model to load.

我在settings.py中使用:

PROJECT_DIR = os.path.dirname(os.path.abspath(__file__)) 
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)

目录:

myproject/
++ static/  #(created by django)
++ __init__.py
++ settings.py
++ ...
myapp/
static/ #(where I'm putting the files)
++ myapp/
++++ test_model/
++++++ model.json
++++++ otherfile.bin
manage.py

所以文件被放入static/myapp/test_model/,然后我运行python manage.py collectstatic,文件被重新整理,并复制到myproject/static/myapp/test_model/

视图中加载的.html:(localhost/myapp/test_model/)

<html>
<head>
% load static %

...

<script src = "% static "myapp/test_model/main.js" %" > </script>

</head>
<body>
...
</body>
% block javascript %
<script>
  start()
</script>
% endblock %
</html>

Javascript:

async function start() 
    model = await tf.loadLayersModel('model.json')
    model.predict(tf.zeros([1, 28, 28, 1]))
    await loadClasses()
   

但是,当我加载页面时,模型没有加载并且 django 控制台返回: Not Found: /myapp/test_model/model.json

【问题讨论】:

【参考方案1】:

编辑:

错误可能在您的await tf.loadLayersModel('model.json') 中。

你必须在那里使用% static 'myapp/test_model/model.json' %

例如await tf.loadLayersModel(% static 'myapp/test_model/model.json' %) 但是你不能在你的 JS 文件中这样做。

将其存储在模板中的变量中,

例如。 let modelfile = "% static 'myapp/test_model/model.json' %";

你可以在你的js文件中使用这个变量:

await tf.loadLayersModel(modelfile);

原答案:

您需要正确设置 STATIC_ROOT 常量,这样 Django 会在您运行 collectstatic 后找到您的文件。

STATIC_ROOT = os.path.join(BASE_DIR, 'static') # Absolute path to the static directory

我建议您将收集静态文件的文件夹的名称更改为与复制它们的位置不同的名称。

此外,请参阅此处了解 Django 中不同静态常量之间的说明: Difference between static STATIC_URL and STATIC_ROOT on Django

【讨论】:

我应该在我的问题中包含 STATIC_ROOT,抱歉。我现在编辑了问题以包含它。但是我想指出,正如我所说,Django 确实从我的静态目录中收集了我的 CSS 和 JS 文件,但它似乎忽略了我的 JSON 文件。 当您运行 collectstatic 时,它不会忽略您的 JSON 文件。您可能的意思是当您运行启动功能时它没有找到它,对吧?更新了我对这个问题的回答。 感谢您的回答,但是按照建议使用 var 仍然不起作用,并且 Django 返回 'Not Found: /myapp/% static 'myapp/test_model/model.json' %' 这很有趣,因为它在静态引用之前添加了“/myapp/”,不确定应该这样做。 你需要在你的模板文件中包含let modelfile = "% static 'myapp/test_model/model.json' %";这一行,而不是在你的js中。

以上是关于运行 JS 脚本的 Django 需要返回 Not Found 的 JSON(静态收集)的主要内容,如果未能解决你的问题,请参考以下文章

Django 框架中制作定时触发脚本

Python Django 在脚本和图像上返回 400 条 GET 消息

在对象属性的“js”脚本中应用 django 的模板过滤器

如何在网页中调用python脚本?

Django Media url 返回 404 NOT FOUND

运行shell脚本报错```$'\r':command not found```