Django управление доступностью статических файлов

пример дерева приложений:

articles
├── admin.py
├── apps.py
├── models.py
├── static
│   ├── css
│   │   ├── article_change.css
│   │   ├── article_create.css
│   │   ├── article_detail.css
│   └── js (obfuscated)
│       ├── article_create.js
│       ├── article_list.js
│       ├── edit_process.js
│       ├── editor.js
│       └── js (readable)
│           ├── article_create.js
│           ├── article_list.js
│           ├── edit_process.js
│           └── editor.js
├── templates
│   └── articles
│       ├── article_create.html
│       ├── article_detail.html
│       ├── edit_process.html
│       └── editor.html
├── tests.py
├── urls.py
└── views.py
  1. static/js/js содержит javascript, читаемый человеком
  2. static/js содержит обфусцированные файлы javascript.

Я написал тег шаблона для включения файлов:

@register.simple_tag
def jstatic(path):
    s = ''
    if settings.DEBUG:
        s = 'js/'
    return static(s + path)

в шаблонах, я могу сделать:

<script src="{% jstatic 'js/info.js' %}"></script>

который условно отображает статические файлы javascript, основываясь на режиме DEBUG. тогда как, если не в режиме DEBUG, будет обслуживать обфусцированные файлы.

дело в том, что я не хочу, чтобы доступ к файлу с необфусцированным содержимым осуществлялся, когда DEBUG не включен, что запускает приложение на сервере.

Когда отладка включена, я хочу, чтобы пользователь мог посещать только обфусцированные файлы:

static/js/js/info.js

и не имеют доступа к

static/js/info.js

все приложения следуют этой конвенции корневого дерева, мне интересно, есть ли способ заблокировать static/js/info.js, если DEBUG не включено.

Это невозможно через стандартную конфигурацию. Как это решить, зависит от вашей конфигурации, но есть три способа решения:

  • Если вы используете какой-то минификатор/вебпак для обфускации ваших JS файлов, вы можете переместить JS файлы в каталог src и поручить вашему инструментарию только копировать, когда DEBUG равен True, и копировать и обфускацию, когда debug равен False.

  • Вы можете использовать два статических каталога, один для читаемых файлов, а другой для обфусцированных (что-то вроде src/static/* и dist/static/*), а затем указывать на исходный каталог только в среде разработки: STATICFILES_DIRS = [ "src/static", "dist/static"] против STATICFILES_DIRS = [ "dist/static"] на продакшене. В этом случае система поиска статических файлов Django вернет первое найденное совпадение.

  • Оставьте вашу конфигурацию как есть, но используйте веб-сервер типа NGINX для обслуживания статических файлов (что уже является рекомендуемым способом обслуживания статических файлов). В конфигурации NGINX вы можете определить местоположение, которое будет 404, пока оно появляется перед местом, обслуживающим ваши статические файлы.

Вернуться на верх