Правильный доступ к статическим файлам django из внешнего javascript - PullRequest
0 голосов
/ 28 мая 2018

У меня есть приложение django, использующее AngularJS с кучей файлов JavaScript и шаблонов.

В моем шаблоне django я могу использовать тег {% static %} для правильной ссылки на эти файлы, например, так:

<script src="{% static "angular/myapp.app.js" %}"></script>

Однако внешние файлы, очевидно, не могут быть разрешены с помощьюшаблонная структура django и поэтому это не вариант.Поэтому чаще всего люди просто жестко кодируют статический путь:

$routeProvider.when('/', {
   // this works but is not ideal
   templateUrl: '/static/pages/some-angular-template.html',  
})

Я видел рекомендации по загрузке STATIC_URL в javascript где-то и его использовании для создания ссылок.Примерно так:

Шаблон Django :

var STATIC_URL = {{ STATIC_URL }};
function getStaticUrl(templatePath) {
  return STATIC_URL + templatePath;
}

Внешний JS :

$routeProvider.when('/', {
   templateUrl: getStaticUrl('/pages/some-angular-template.html'),
})

Это немноголучше, но все же не идеально, потому что он обрабатывает только базовый путь.Если вы хотите использовать что-то вроде ManifestStaticFilesStorage (что я и делаю), вы все равно не получите правильное разрешение файла.

Есть ли какое-нибудь хорошее решение этой проблемы?Варианты, которые я рассматриваю:

  • Начальная загрузка всех необходимых URL-адресов в переменные JS внутри шаблона django
  • Сохранение URL-адресов в некоторой скрытой разметке HTML с использованием тегов data (снова через шаблон django)
  • Создание API для получения URL-адресов (это кажется ненормальным и похоже, что это будет ужасно с точки зрения производительности).

Просто интересно, есть ли стандартная практика или библиотека, которая занимается этимвопрос?Я сталкивался с этой проблемой несколько раз и никогда не находил удовлетворительного решения.

1 Ответ

0 голосов
/ 28 мая 2018

Мое текущее решение (которое отлично работает, если не самое элегантное) просто создает огромный глобальный констант в шаблоне django и затем ссылается на них непосредственно в JS.

Шаблон Django :

<script type="text/javascript">
    NG_STATIC_FILES = {
       "HOME": "{% static '/pages/home.html' %}",
       "SOMETHING_ELSE": "{% static '/pages/some-angular-template.html' %}",
    };
</script>

Внешний JS :

$routeProvider.when('/', {
    templateUrl: NG_STATIC_FILES.SOMETHING_ELSE,
})

и т. Д.

...