【问题标题】:ObjectDoesNotExist not catching a DoesNotExist exceptionObjectDoesNotExist 没有捕捉到 DoesNotExist 异常
【发布时间】:2017-11-09 17:38:51
【问题描述】:

我正在尝试捕获 DoesNotExist 异常,并且检查引发异常的代码很困难。我无法到达在 pdb 中引发它的行,并且在调试跟踪中没有关于什么对象引发异常的信息,因为它包含在实例变量下,因此 django 跟踪不显示它的值是什么。

我已经阅读了https://docs.djangoproject.com/en/1.11/ref/exceptions/#objectdoesnotexist 的文档和Catching Any DoesNotExist Error 的这个问题。这两个都表明要捕获任何 DoesNotExist 异常,只需导入 ObjectDoesNotExist 并涵盖所有这些异常。我的情况不是这样。我的 except ObjectDoesNotExist 块中没有捕获异常。

代码:

from django.core.exceptions import ObjectDoesNotExist

def check_permission(user):
    """function checks whether the user is in the list of allowed groups"""
    for option in ALLOWED: # list of groups, constant
        try:
            if user.groups.get().name == option:
                return True
        except ObjectDoesNotExist:
            pass
        else:
            pass
    return False

跟踪显示:

File 
".../lib/python3.6/site-packages/django/db/models/query.py", line 379, in get self.model._meta.object_name

django.contrib.auth.models.DoesNotExist: Group matching query does not exist.

从我的代码行中抛出的内容:

if user.groups.get().name == option

尝试访问 django.contrib.auth.models.DoesNotExist 只会返回一个

AttributeError: model 'django.contrib.auth.models' has no attribute 'DoesNotExist'

我如何捕捉到这个?有时用户不会有任何组,即使网站设计为永远不会发生这种情况,但这里有易破解的代码仍然让我感到紧张。

编辑:python 3.6.2 django 1.11

完整的跟踪:

Traceback (most recent call last):
  File ".../lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
  File ".../lib/python3.6/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
  File ".../lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
  File ".../lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File ".../lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
  File ".../lib/python3.6/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
  File ".../lib/python3.6/site-packages/django/views/generic/base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
  File "/Users/Mark/Desktop/Professional/FSC/water/WATER/sharedClasses.py", line 116, in get
return self.permission_denied_page(request, plans)
  File "/Users/Mark/Desktop/Professional/FSC/water/WATER/sharedClasses.py", line 68, in permission_denied_page
their_acccount = user.groups.get().name
  File ".../lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
  File ".../lib/python3.6/site-packages/django/db/models/query.py", line 379, in get
self.model._meta.object_name
django.contrib.auth.models.DoesNotExist: Group matching query does not exist.

【问题讨论】:

    标签: django authentication


    【解决方案1】:

    你应该像这样导入 Group 和 catch:'

    from django.contrib.auth.models import Group
    
    try:
        // your code
    except Group.DoesNotExist:
       // to handle
    

    顺便说一句,你为什么不以更优化的方式编写你的方法:

    def check_permission(user):
       """return true if the user is in options, false if not"""
       if user.groups.filter(name__in=ALLOWED).exists():
          return True
       else:
          return False
    

    【讨论】:

    • 完全这样做是行不通的。未捕获异常。
    • 是的。它会抛出它,就好像 except 块甚至不存在一样
    • 我不确定为什么不起作用。您可以查看我的替代答案。
    • 您的替代答案有效!不知道为什么,但是在你的代码而不是我的代码周围有一个 try-catch 块允许 ObjectDoesNotExist 捕获异常。
    • 完整的回溯向您展示了原因 - 异常是从您在答案中包含的代码之外的代码引发的。 their_acccount = user.groups.get().name 是导致异常的原因,在您的 permission_denied_page 视图中。所以它根本不在你的check_permission 代码中。
    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2015-11-21
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多