4

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带有给定消息的响应。

4

2 回答 2

5

我认为您想要的是实现process_exception的中间件

它的工作原理是这样的:您在查看时引发异常(例如 ImmediateHttpResponse)。如果您的中间件捕获了异常,则中间件返回响应,在您的情况下,状态为 400。如果您没有捕获异常,Django 将在最后捕获它,返回状态 500(服务器错误),或其他状态。

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

于 2013-07-15T09:53:51.100 回答
2

这也不例外,但有HttpResponseBadRequest,这是你的正常情况,HttpResponse但有400

Http404例外只是一个空Exception没有什么特别之处:

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
于 2013-07-15T09:38:29.840 回答