Я пытаюсь развернуть на Heroku мое приложение, созданное с использованием Django 2, DRF и Angular 6, и пытаюсь получить статические файлы моего приложения Angular. Я использую WhitheNoise как для среды разработки, так и для Heroku.
Структура проекта следующая:
my_project/
|-frontend/
| |- dist/
| |- ...
|-myproject/
| |-settings/
| | |- __init.py
| | |- base.py
| | |- prod.py
| | |- dev.py
| |- __init__.py
| |- urls.py
| |- views.py
| |- wsgi.py
|-other_app1/
| |- ...
|-other_app2/
| |- ...
|-staticfiles/
| |-....
|-manage.py
|-Procfile
|-requirements.txt
Я настроил Heroku таким образом, чтобы при каждом развертывании моего приложения создавалось мое угловое приложение, поэтому статические файлы генерируются в frontend / dist /, затем запускается collectstatic и копирует их в папку статических файлов в корень моего проекта. Мои настройки:
ANGULAR_APP_DIR = os.path.join(BASE_DIR, 'frontend/dist')
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = [
('frontend', os.path.join(ANGULAR_APP_DIR)),
]
Это прекрасно работает и собирает все файлы моего углового приложения внутри staticfiles / в папке с именем frontend /
Моя проблема в том, что сейчас я пытаюсь обработать файл index.html, который находится в staticfiles / frontend, и не могу заставить его работать:
urls.py
urlpatterns = [
path('', HomePageView.as_view()), #first one
# .... Other urls
]
views.py
from django.views import static
# Serves the index page
class HomePageView(TemplateView):
def get(self, request, **kwargs):
return static.serve(request,'index.html', 'staticfiles')
Это находит и обслуживает файл index.html, но не может успешно обслуживать остальные необходимые js-файлы для запуска моего приложения (polyfills, main, styles ...), так как «/ static /» не добавляется автоматически на URL, который их запрашивает.
Кто-нибудь знает, как я могу сказать Django или Heroku найти их в папке staticfiles / frontend?
Сгенерированный index.html выглядит так:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>My Angular Project</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="stylesheet" href="styles.578ada0b0e3742b4b4bb.css"></head>
<body class="with-top-navbar">
<app-root></app-root>
<script type="text/javascript" src="runtime.92d800a8cdfd75f49eae.js"></script>
<script type="text/javascript" src="polyfills.7ee4ee2275a8c5d5ea6f.js"></script>
<script type="text/javascript" src="main.4aeccc46b72bbab58fd0.js"></script></body>
</html>
И вывод моей консоли:
[29/Jun/2018 13:31:30] "GET / HTTP/1.1" 200 638
Not Found: /styles.578ada0b0e3742b4b4bb.css
Not Found: /runtime.92d800a8cdfd75f49eae.js
[29/Jun/2018 13:31:30] "GET /styles.578ada0b0e3742b4b4bb.css HTTP/1.1" 404 2353
Not Found: /polyfills.7ee4ee2275a8c5d5ea6f.js
Not Found: /main.4aeccc46b72bbab58fd0.js
[29/Jun/2018 13:31:30] "GET /polyfills.7ee4ee2275a8c5d5ea6f.js HTTP/1.1" 404 2359
[29/Jun/2018 13:31:30] "GET /runtime.92d800a8cdfd75f49eae.js HTTP/1.1" 404 2353
[29/Jun/2018 13:31:30] "GET /main.4aeccc46b72bbab58fd0.js HTTP/1.1" 404 2344
Not Found: /styles.578ada0b0e3742b4b4bb.css
[29/Jun/2018 13:31:32] "GET /styles.578ada0b0e3742b4b4bb.css HTTP/1.1" 404 2353
Not Found: /runtime.92d800a8cdfd75f49eae.js
[29/Jun/2018 13:31:32] "GET /runtime.92d800a8cdfd75f49eae.js HTTP/1.1" 404 2353
Not Found: /polyfills.7ee4ee2275a8c5d5ea6f.js
[29/Jun/2018 13:31:32] "GET /polyfills.7ee4ee2275a8c5d5ea6f.js HTTP/1.1" 404 2359
Not Found: /main.4aeccc46b72bbab58fd0.js
[29/Jun/2018 13:31:32] "GET /main.4aeccc46b72bbab58fd0.js HTTP/1.1" 404 2344
Также обратите внимание, что я не хочу ни редактировать вручную созданный index.html, ни размещать его где-либо еще, так как это изменит мой рабочий процесс развертывания.
Кроме того, я знаю, что django.views.statics.serve не подходит для производства, поэтому советы также приветствуются, если вы знаете, как обрабатывать этот файл другим способом
Спасибо!