ObjectDoesNotExist不捕获DidNotExist异常

ale*_*ert 3 authentication django

我试图捕获一个DidNotExist异常,并且很难检查抛出该异常的代码。我无法到达将其抛出到pdb中的那一行,并且在调试跟踪中,没有关于引发异常的对象的信息,因为它包含在实例变量下,因此django跟踪不会显示其值。

我已经阅读了https://docs.djangoproject.com/zh-CN/1.11/ref/exceptions/#objectdoesnotexist上的文档,并在“ 捕获任何DidNotExist错误”中发现了这个问题。这两个都表明,要捕获任何DidNotExist异常,只需导入ObjectDoesNotExist即可覆盖所有异常。在我来说不是。我的除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
Run Code Online (Sandbox Code Playgroud)

跟踪显示为:

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.
Run Code Online (Sandbox Code Playgroud)

这是从我的代码行中抛出的:

if user.groups.get().name == option
Run Code Online (Sandbox Code Playgroud)

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

AttributeError: model 'django.contrib.auth.models' has no attribute 'DoesNotExist'
Run Code Online (Sandbox Code Playgroud)

我该如何捕捉?有时用户将没有任何组,即使该站点是为永不中断而设计的,但仍令我感到不安的是,这里存在易破解的代码。

编辑: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.
Run Code Online (Sandbox Code Playgroud)

Moh*_*eem 5

您应该导入Group并像这样捕获:

from django.contrib.auth.models import Group

try:
    // your code
except Group.DoesNotExist:
   // to handle
Run Code Online (Sandbox Code Playgroud)

顺便说一句,为什么不以非常优化的方式编写如下的方法:

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
Run Code Online (Sandbox Code Playgroud)

  • 完整的追溯向您显示原因-异常是由代码(而不是答案中所包含的)引发的。在您的“ permission_denied_pa​​ge”视图中,“ their_acccount = user.groups.get()。name”是导致异常的原因。因此,它根本不在您的`check_permission`代码中。 (2认同)