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>
Вернуться на верх