Django是否有立即的http响应例外?

时间:2013-07-15 09:35:50

标签: python django

Django-Tastypie有ImmediateHttpResponse例外,它允许立即回复客户端:

raise ImmediateHttpResponse(response='a message')

Django有Http404,但我找不到像ImmediateHttpResponse这样的更普遍的例外。

您使用什么技术立即向客户返回400响应?

例如有模特:

class Subscriber(Model):

    def delete(self, *args, **kwargs):
        raise ImmediateHttpResponse('Deleting subcribers is not allowed!')

并尝试删除对象会使用给定的消息向客户端返回400响应。

2 个答案:

答案 0 :(得分:5)

我认为你想要的是middleware,它实现了process_exception

它的工作方式如下:您在视图上引发异常(例如ImmediateHttpResponse)。如果您的中间件捕获到异常,则中间件返回响应,在您的情况下返回状态为400.如果您没有捕获异常,Django最终将捕获它,返回状态500(服务器错误),或其他状态。

最简单的例子是捕获Http404的中间件。如果您在中间件中捕获异常Http404,则可以返回所需的任何响应(状态200,400等)。如果没有捕获(即中间件的process_exception方法返回None),Django将为您捕获它并返回状态为404的响应。这实际上是您想要响应的自定义异常的标准方法一种自定义的方式。

答案 1 :(得分:2)

这不是一个例外,但有HttpResponseBadRequest,这是您的正常HttpResponse400

Http404例外只是an empty Exception class,没有什么特别之处:

class Http404(Exception):
    pass

因此,如果您必须,您可以轻松创建自己的:

class Http400(Exception):
    pass

ImmediateHttpResponseHttp404的区别并不大,因为它也是通用Exception但具有特定属性,这使其更像HttpResponseBadRequest

class ImmediateHttpResponse(TastypieError):
    """
    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

    """
    _response = HttpResponse("Nothing provided.")

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

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