Я пишу свой первый настоящий проект на Django, и у меня возникла проблема с правильной настройкой DEBUG
в разработке и производстве. В моем файле проекта settings.py
у меня есть:
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.environ.get('DJANGO_DEBUG', 'True') == 'True'
Поэтому я ожидаю, что это должно работать следующим образом. По умолчанию DEBUG
установлено на True
(я использую это в своей разработке). Но на моем рабочем сервере у меня есть переменная среды DJANGO_DEBUG
, установленная на "False"
, поэтому Django должен установить DEBUG
на False
.
Но это не работает! Когда я перехожу к my_website/notexistingurl
, я вижу страницу с подробной информацией об ошибках Django, в которой говорится, что у меня DEBUG
установлено значение True
в моем файле settings.py
. И чтобы это было совершенно непонятно для меня, когда я открываю оболочку Python на своем сервере, она говорит, что os.environ.get('DJANGO_DEBUG', 'True') == 'True'
— это False
.
Кто-нибудь знает, что мне не хватает? Потому что для меня это выглядит как две совершенно противоположные вещи!
Сервер часто работает с другим пользователем, чтобы люди, которые могут получить доступ к веб-серверу, не могли получить доступ ко всем вашим файлам. Так что это не потому, что вы устанавливаете путь для своего пользователя, это также для пользователя веб-сервера.
При этом, возможно, было бы лучше реализовать это противоположным образом, поэтому DEBUG = os.environ.get('DJANGO_DEBUG', 'False') == 'True'
, когда вы работаете в режиме отладки, когда он явно установлен, прямо сейчас вы работаете в рабочей среде только тогда, когда он явно установлен, но это более рискованно.
Спасибо @WillemVanOnsem. Кажется, теперь я знаю, что делать.
Это скорее предположение, но обычно сервер Django не будет работать под тем же пользователем, что и «администратор». Действительно, в качестве дополнительной меры безопасности часто такие процессы запускаются от имени отдельного пользователя с ограниченными привилегиями.
Цель состоит в том, чтобы предотвратить пользователей, которые каким-либо образом могут внедрить код в ваше приложение Django, чтобы получить больше контроля. В самом деле, представьте, что хакер нашел способ оценить произвольный код Python с помощью сервера Django, тогда этот хакер мог бы в конечном итоге получить контроль над всеми, кто думает, что пользователь, который запускает приложение Django, имеет контроль над такими файлами, устройствами, интернет-соединениями и т. д. , Чтобы ограничить это, часто приложение Django будет работать с пользователем, у которого есть много привилегий, необходимых для запуска приложения Django, но не (намного) больше. Хотя все еще могут быть эксплойты для выполнения повышения привилегий, это, по крайней мере, сделает его более сложным и трудоемким.
Таким образом, это означает, что среда пользователя, с которым вы настраиваете приложение Django, не является пользователем, который запускает приложение Django, и поэтому переменная среды, вероятно, не установлена для этого пользователя. Не существует универсального способа решить эту проблему, так как это, вероятно, зависит от вашего хостинг-провайдера, но (очень) вероятно, есть способы установить переменные среды для пользователя приложения django.
Но тем не менее, возможно, было бы лучше «обратить» настройку: сейчас вы работаете в режиме отладки по умолчанию и только в режиме производства, когда это явно установлено. Это более рискованно, поскольку что-то может пойти не так при установке переменной среды или развертывании приложения. Когда приложение Django работает в режиме отладки, оно показывает фрагменты исходного кода, и, возможно, можно манипулировать представлением, которое обслуживает статические/медиафайлы, для обслуживания более конфиденциальных файлов. Возможно, лучше запускать по умолчанию в производственном режиме и запускать в режиме отладки только тогда, когда это явно указано. Например с:
DEBUG = os.environ.get('DJANGO_DEBUG', 'False') == 'True'
Вы должны бежать
heroku config:set "Set DEBUG VALUE"
Вы случайно не устанавливаете переменную с WSGI?