姜戈。生产中的调试
Posted
技术标签:
【中文标题】姜戈。生产中的调试【英文标题】:Django. DEBUG in production 【发布时间】:2021-03-24 00:53:32 【问题描述】:我正在用 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
。
有人知道我缺少什么吗?因为在我看来,这似乎是两件完全矛盾的事情!
【问题讨论】:
你有没有机会用 WSGI 设置一个变量? 服务器通常与 不同的 用户一起运行,这是为了避免可能接管网络服务器的人访问您的所有文件。因此,不是因为您为 your 用户设置了路径,它也是为网络服务器用户设置的。 话虽如此,以相反的方式实现它可能会更好,所以DEBUG = os.environ.get('DJANGO_DEBUG', 'False') == 'True'
,这样你在显式设置时以调试模式运行,现在你只在显式设置时在生产中运行,但这风险更大。
谢谢@WillemVanOnsem。我想我现在知道该怎么做了。
【参考方案1】:
这更像是一种猜测,但通常 Django 服务器将不会在与“管理员”相同的用户下运行。事实上,作为一种额外的安全措施,这些进程通常在具有有限权限的单独用户下运行。
目的是防止用户以某种方式在您的 Django 应用程序中注入代码以获得更多控制权。事实上,假设黑客找到了一种通过 Django 服务器评估任意 Python 代码的方法,那么黑客最终可以控制所有认为运行 Django 应用程序的用户可以控制文件、设备、互联网连接等的人. 为了限制这一点,通常 Django 应用程序将与具有运行 Django 应用程序所需的那么多权限的用户一起运行,但不会(太多)超过这个权限。虽然可能仍有漏洞可以执行privilege escalation,但这至少会使其变得更加困难和耗时。
因此,这意味着您设置 Django 应用程序的用户的环境不是 运行 Django 应用程序的用户,因此可能没有为此设置环境变量用户。没有通用的方法来解决这个问题,因为这可能取决于您的托管服务提供商,但(非常)可能有一些方法可以为 django 应用用户设置环境变量。
但是,“反转”设置可能会更好:现在您默认在调试模式下运行,并且只有在明确设置时才在生产中运行。那风险更大,因为在设置环境变量或部署应用程序时可能会出错。当 Django 应用程序在调试模式下运行时,它会显示源代码的片段,并且可能可以操纵提供静态/媒体文件的视图以提供更敏感的文件。默认情况下在生产模式下运行可能会更好,并且仅在明确说明时才在调试模式下运行。例如:
DEBUG = os.environ.get('DJANGO_DEBUG', <b>'False'</b>) == 'True'
【讨论】:
以上是关于姜戈。生产中的调试的主要内容,如果未能解决你的问题,请参考以下文章