django在某处提出异常

时间:2014-09-03 09:57:25

标签: python django django-views python-social-auth

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.associate_by_email',
)

使用settings.py中的上述代码我可以避免......

(1062, "Duplicate entry 'example@example.com' for key 'email'")错误消息。

但我在线搜索,我发现这个方便的代码将exception扔到所需的html页面中:

[代码1]:#backends.py

class MySocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
    def process_exception(self, request, exception):
        msg = None
        if #no duplicate email:
            return HttpResponse("# catched exception")
        else:
            # processing msg here
            return render_to_response(# html, {msg}, context)

#settings.py

MIDDLEWARE_CLASSES = (
    'frontend.backends.MySocialAuthExceptionMiddleware'
)

根据上面的代码,我的问题是solved。但是之前我使用以下代码处理了另一个功能,它与上述概念完全不同。

[代码2]:

def function(request):
    #actual code here
    return HttpResponse('msg here')

但是在运行上面的代码时,我收到了错误消息,如

tuple index out of range ..

MySocialAuthExceptionMiddleware

实际上这不是上述代码的错误消息。此消息与“ [代码1] ”的代码有关。

然后,我如何获得“ [Code 2] ”的实际错误消息。

1 个答案:

答案 0 :(得分:1)

你不需要经历所有这些头痛。 django中的异常并不特殊,它们是Python的一部分。

如果您想提出自定义异常 - 您可以在任何地方执行此操作:

class MyException(Exception):
    pass

def function(request):
    raise MyException('msg here')

您面临的问题是,在django中,即使请求与该中间件“无关”,也会在每个请求上调用中间件。

因此,在编写中间件时,您需要记住,它将针对每个请求进行调用,并且应该正确处理这些情况。