【问题标题】:How to set settings.DEBUG == True only for superuser and False for all users如何设置 settings.DEBUG == True 仅适用于超级用户, False 适用于所有用户
【发布时间】:2019-05-31 18:15:48
【问题描述】:

我正在使用 Django 2.1,我的项目已准备好投入生产。有没有一种方法可以设置 settings.DEBUG == True 仅适用于超级用户,并为普通用户显示默认的 500 内部服务器错误。我试图写一个中间件,但它似乎不起作用。我不想使用哨兵(很多地方都推荐)。 我的 middlewares.py 是:

import sys
from django.views.debug import technical_500_response
from django.conf import settings
from django.contrib.auth import get_user_model

user = get_user_model()  #I am using CustomUser model not Django user model

class UserBasedExceptionMiddleware(object):
def __init__(self, get_response):
    self.get_response = get_response

def __call__(self, request):
    return self.get_response(request)

def process_exception(self, request, exception):
    if request.user.is_superuser:
        return technical_500_response(request, *sys.exc_info())

我还加载了我的中间件。

MIDDLEWARE = ['myproject.middlewares.UserBasedExceptionMiddleware',]

【问题讨论】:

  • 500 错误表示未处理的异常,因此您不能依赖身份验证框架来确定用户是否真的是超级用户。出于安全和性能原因,DEBUG=True 用于开发。我建议您找到其他方法来解决您要解决的任何问题。
  • 如您所知,DEBUG=True 给出了错误的整个回溯。所以我试图只为超级用户而不是任何其他用户实现这个引用。您能否指出一些其他方法或软件包,这些方法或软件包只能为超级用户显示完整的错误回溯。谢谢

标签: python django python-3.x django-2.1


【解决方案1】:

我认为这是不可能的。设置文件从Django网站运行一开始就设置好了,但是认证检查部分是在视图功能或模板渲染中,这要晚得多,无法更改设置的设置。

【讨论】:

    【解决方案2】:

    我找到了一种无需更改调试即可使用开发服务器调试应用程序的方法。 为此,我制作了一个 debug_setting.py 文件(我的 settings.py 文件所在的位置)。

    在我的 debug_setting.py 中:

    from .settings import *
    DEBUG = True
    

    然后在终端中使用:

    python manage.py runserver --settings=myproject.debug_setting 0.0.0.0:5000
    

    我们可以在不更改生产环境的 DEBUG=True 的情况下查看应用程序错误的回溯。

    更新:

    另外,我们也可以使用 django 的错误报告系统,该系统会自动发送 500 和 404 错误,并将整个回溯到 ADMINS = [] 和 MANAGERS = [] 中描述的邮件地址。对于此功能,我们需要 smtp 设置,如 EMAIL_HOST、EMIL_HOST_UESR、EMAIL_HOST_PASSWORD。 详情在这里https://docs.djangoproject.com/en/3.0/howto/error-reporting/

    【讨论】:

    • 注意:这不是您在问题中提出的要求。这是以不同的方式启动 Django。当以这种方式启动时,对于普通用户和管理员用户,Django 实际上会表现相同。 (或者......换句话说......你的答案表明你的答案是XY Problem。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2011-11-16
    • 2015-09-03
    • 2018-12-10
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多