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
响应。
答案 0 :(得分:5)
我认为你想要的是middleware,它实现了process_exception。
它的工作方式如下:您在视图上引发异常(例如ImmediateHttpResponse)。如果您的中间件捕获到异常,则中间件返回响应,在您的情况下返回状态为400.如果您没有捕获异常,Django最终将捕获它,返回状态500(服务器错误),或其他状态。
最简单的例子是捕获Http404的中间件。如果您在中间件中捕获异常Http404,则可以返回所需的任何响应(状态200,400等)。如果没有捕获(即中间件的process_exception方法返回None),Django将为您捕获它并返回状态为404的响应。这实际上是您想要响应的自定义异常的标准方法一种自定义的方式。
答案 1 :(得分:2)
这不是一个例外,但有HttpResponseBadRequest
,这是您的正常HttpResponse
但400
。
Http404
例外只是an empty Exception
class,没有什么特别之处:
class Http404(Exception):
pass
因此,如果您必须,您可以轻松创建自己的:
class Http400(Exception):
pass
ImmediateHttpResponse
与Http404
的区别并不大,因为它也是通用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