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
static/js/js
содержит javascript, читаемый человеком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, пока оно появляется перед местом, обслуживающим ваши статические файлы.