姜戈。在生产中调试
Django. DEBUG in production
我正在用 Django 编写我的第一个 real 项目,我在开发和生产中正确设置 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 详细信息错误页面,它说我在我的 settings.py
文件中将 DEBUG
设置为 True
。为了让我完全不清楚,当我在我的服务器上打开 python shell 时,它说 os.environ.get('DJANGO_DEBUG', 'True') == 'True'
是 False
.
有人知道我错过了什么吗?因为在我看来,这是完全矛盾的两件事!
这更多是猜测,但通常 Django 服务器将 not 运行 在与“管理员”相同的用户下。实际上,作为一种额外的安全措施,此类进程通常 运行 在具有有限权限的 单独 用户下进行。
目的是防止用户以某种方式在您的 Django 应用程序中注入代码以获得更多控制权。实际上,想象一下黑客找到了一种方法来评估 Django 服务器的任意 Python 代码,然后黑客最终可以控制所有认为 运行 正在使用 Django 应用程序的用户可以控制这样的代码作为文件,设备,互联网连接等。为了限制这一点,Django 应用程序通常会 运行 与具有 运行 Django 应用程序所需的权限的用户,但不会(太多)超过那。虽然可能仍有漏洞可以执行 privilege escalation,但这至少会使它变得更加困难和耗时。
这意味着您设置 Django 应用程序的用户环境不是 运行s Django 应用程序的用户,并且因此可能没有为该用户设置环境变量。没有通用的方法来解决这个问题,因为这可能取决于您的托管服务提供商,但(很)可能有办法为 Django 应用程序用户设置环境变量。
但是,“反转”设置可能会更好:现在您 运行 默认处于调试模式,并且只有在明确设置时才会在生产模式下使用。这样做的风险更大,因为在设置环境变量或部署应用程序时可能会出错。当 Django 应用程序 运行 处于调试模式时,它会显示源代码片段,并且可以操纵为 static/media 文件提供服务的视图以提供更敏感的文件。在生产模式下默认 运行 可能更好,而在明确说明的调试模式下仅 运行 。例如:
DEBUG = os.environ.get('DJANGO_DEBUG', <b>'False'</b>) == 'True'
我正在用 Django 编写我的第一个 real 项目,我在开发和生产中正确设置 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 详细信息错误页面,它说我在我的 settings.py
文件中将 DEBUG
设置为 True
。为了让我完全不清楚,当我在我的服务器上打开 python shell 时,它说 os.environ.get('DJANGO_DEBUG', 'True') == 'True'
是 False
.
有人知道我错过了什么吗?因为在我看来,这是完全矛盾的两件事!
这更多是猜测,但通常 Django 服务器将 not 运行 在与“管理员”相同的用户下。实际上,作为一种额外的安全措施,此类进程通常 运行 在具有有限权限的 单独 用户下进行。
目的是防止用户以某种方式在您的 Django 应用程序中注入代码以获得更多控制权。实际上,想象一下黑客找到了一种方法来评估 Django 服务器的任意 Python 代码,然后黑客最终可以控制所有认为 运行 正在使用 Django 应用程序的用户可以控制这样的代码作为文件,设备,互联网连接等。为了限制这一点,Django 应用程序通常会 运行 与具有 运行 Django 应用程序所需的权限的用户,但不会(太多)超过那。虽然可能仍有漏洞可以执行 privilege escalation,但这至少会使它变得更加困难和耗时。
这意味着您设置 Django 应用程序的用户环境不是 运行s Django 应用程序的用户,并且因此可能没有为该用户设置环境变量。没有通用的方法来解决这个问题,因为这可能取决于您的托管服务提供商,但(很)可能有办法为 Django 应用程序用户设置环境变量。
但是,“反转”设置可能会更好:现在您 运行 默认处于调试模式,并且只有在明确设置时才会在生产模式下使用。这样做的风险更大,因为在设置环境变量或部署应用程序时可能会出错。当 Django 应用程序 运行 处于调试模式时,它会显示源代码片段,并且可以操纵为 static/media 文件提供服务的视图以提供更敏感的文件。在生产模式下默认 运行 可能更好,而在明确说明的调试模式下仅 运行 。例如:
DEBUG = os.environ.get('DJANGO_DEBUG', <b>'False'</b>) == 'True'