Django запускает JS-скрипт, для которого требуется JSON, возвращающий Not Found (статический сборник) - PullRequest
0 голосов
/ 24 сентября 2019

Отказ от ответственности : я очень мало знаю Javascript

Я пытаюсь запустить TensorflowJS в экземпляре Django, я могу успешно загрузить JS для вызова функции tf.loadLayersModel, однакодля этой функции требуется файл json (и еще один файл .bin позже), и функция не может его найти.

Оба файла (json и bin) находятся в ожидаемом статическом каталоге (то же самое, что и файл JS, загруженный в первую очередь), но каждый раз, когда я загружаю страницу, Django возвращает Not Found: /myapp/test_model/model.json и браузер возвращает (через элемент проверки) 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 Ответ

0 голосов
/ 24 сентября 2019

Редактировать:

Ошибка, вероятно, в пределах вашей 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: Разница между статическими STATIC_URL и STATIC_ROOT в Django

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...