Django collectstatic для поиска каталога assets в каждом приложении в проекте django
В настоящее время у меня есть 6-7 приложений, присутствующих в моем проекте Django. В settings.py для STATICFILES_DIRS мне нужно указать полный путь к директории assets, присутствующей во всех моих приложениях, что громоздко в случае, если я увеличиваю количество приложений каждый раз, когда мне нужно добавлять путь сюда. Нет ли какой-нибудь настройки, с помощью которой я могу указать только папки assets и команда collectstatic будет искать статические файлы внутри assets во всех моих приложениях?
Вот что у меня есть на данный момент:
STATICFILES_DIRS = [
BASE_DIR / "app1/templates/assets",
BASE_DIR / "app2/templates/assets",
BASE_DIR / "app3/templates/assets",
BASE_DIR / "app4/templates/assets",
BASE_DIR / "app5/templates/assets",
BASE_DIR / "app6/templates/assets",
]
Мне нужно было что-то вроде этого, и collectstatic пошел бы во все мои приложения (1-6) в поисках каталога assets.
STATICFILES_DIRS = [
'templates/assets',
]
Есть ли способ сделать то же самое?
Вы можете использовать код ниже, если не хотите делать это для всех приложений
STATICFILES_DIRS = [
BASEDIR / 'templates/assets',
]
Из документации Django 4.0 : https://docs.djangoproject.com/en/4.0/ref/contrib/staticfiles/
Согласно конвенции Django, все статические файлы для каждого приложения могут находиться в каталоге static. Лучше создать другую папку внутри статической директории с тем же именем, что и проект(projectname/appname/static/appname/[все статические файлы и папки])
По умолчанию поиск производится во всех местах, определенных в STATICFILES_DIRS и в 'статическом' каталоге приложений, указанных параметром INSTALLED_APPS.
Примечание: % static всегда ищет под STATIC_ROOT, указанным в settings.py, STATICFILES_DIRS и в статическом каталоге внутри каждого приложения.
index.html
<link rel="stylesheet" href="{% static 'app/css/bootstrap.min.css' %}" />
<link rel="stylesheet" href="{% static 'app/css/LineIcons.2.0.css' %}" />
<link rel="stylesheet" href="{% static 'app/css/animate.css' %}" />
<link rel="stylesheet" href="{% static 'app/css/tiny-slider.css' %}" />
<link rel="stylesheet" href="{% static 'app/css/glightbox.min.css' %}" />
<link rel="stylesheet" href="{% static 'app/css/main.css' %}" />
settings.py
STATICFILES_DIRS = [
# specify other static directory where static files are stored n your environment.
# by default static folders under each app are always looked into and copied.
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # this is the folder where all static files are going to be stored after we run collectstatic command
STATIC_URL = '/static/' # this is the url from which static elements can be accessed
В производстве :
Обычной тактикой является предоставление статических файлов из облачного хранилища, такого как Amazon S3 и/или CDN (сеть доставки контента). Это позволяет игнорировать проблемы, связанные с обслуживанием статических файлов, и часто может ускорить загрузку веб-страниц (особенно при использовании CDN).
Основная схема запуска статических файлов в производство состоит из двух шагов: выполнение команды collectstatic при изменении статических файлов, затем организация перемещения каталога собранных статических файлов (STATIC_ROOT) на сервер статических файлов и их обслуживание.
Но здесь мы обслуживаем статические файлы с той же машины, используя веб-сервер apache.
При каждом изменении статических файлов необходимо выполнить команду
python manage.py collectstatic
И укажите статический url в urls.py
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("app.urls")),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Поскольку все статические файлы будут обслуживаться самим веб-сервером, нам необходимо указать их расположение в нашем конфигурационном файле. Обратите внимание, что важно запустить команду collectstatic в production, когда статические файлы обслуживаются веб-сервером apache. Она ищет статические файлы в месте, указанном вами в конфигурационном файле, которое обычно является каталогом STATIC_ROOT.
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#Serving static files
Alias /static/ /etc/myproject/static/
<Directory /etc/myproject/static>
Require all granted
</Directory>
<Directory /etc/myproject/myproject>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess myproject python-path=/etc/myproject python-home=/etc/myprojectenv
WSGIProcessGroup myproject
WSGIScriptAlias / /etc/myproject/myproject/wsgi.py
</VirtualHost>