如何正确地将此函数重构为另一个文件? Django的

时间:2017-04-26 22:15:39

标签: python django exception return try-catch

我有一个经常使用的tryexcept,所以我想把它拿出来并把它变成其他文件中的function,但我似乎无法制作它有效。

有人可以帮我一把吗?

这是我经常使用的代码

    try:
        user = get_object_or_404(User, email=data['email'])
    except Exception as e:
        print(e)
        return JSONresponse(False, e.message)

我尝试将其制作成另一个文件并以此方式执行

def auth_token(data):
    try:
        return get_object_or_404(User, email=data['email'])
    except Exception as e:
        return JSONresponse({'status': False})

然后当我打电话给auth_token时,我以另一种方式这样做,当然我确实导入了它

user = auth_token(data)

我可以理解这会返回给我JSONresponse({'status': False})并尝试使用raise,它会告诉我我无法使用JSONresponse

有人能告诉我这是怎么做到的吗?

1 个答案:

答案 0 :(得分:1)

最佳做法是使用尽可能简单的参数(这使您的功能更容易测试)。

您在异常情况下寻找的内容可以从auth_token通过您的观点发送:

def auth_token(email):  # this returns a User not a token..?
    try:
        return User.objects.get(email=email)
    except User.DoesNotExist:
        raise ImmediateHttpResponse(JSONresponse({'status': False}))

然后用法:

def myview(request, ...):
    token = auth_token(data['email'])
    ...

任何ImmediateHttpResponse异常都将逃避视图,必须由中间件类获取。

不幸的是,Django没有ImmediateHttpResponse类,但TastyPie有一个我们可以偷的。首先是异常类:

class ImmediateHttpResponse(Exception):
    """This exception is used to interrupt the flow of processing to immediately
       return a custom HttpResponse.

       Common uses include::

           * for authentication (like digest/OAuth)
           * for throttling

       (from TastyPie).
    """
    _response = http.HttpResponse("Nothing provided.")

    def __init__(self, response):
        self._response = response

    @property
    def response(self):
        return self._response

然后是中间件:

from myexceptions import ImmediateHttpResponse

class ImmediateHttpResponseMiddleware(object):
    """Middleware that handles ImmediateHttpResponse exceptions, allowing 
       us to return a response from deep in form handling code.
    """
    def process_exception(self, request, exception):
        if isinstance(exception, ImmediateHttpResponse):
            return exception.response
        return None

此类必须添加到MIDDLEWARE_CLASSES文件中的settings.py 'mymiddleware.ImmediateHttpResponseMiddleware'