Django 是不是有立即 http 响应的例外情况?
Posted
技术标签:
【中文标题】Django 是不是有立即 http 响应的例外情况?【英文标题】:Does Django have exception for an immediate http response?Django 是否有立即 http 响应的例外情况? 【发布时间】:2013-07-13 03:04:26 【问题描述】: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
响应。
【问题讨论】:
【参考方案1】:我认为您想要的是实现process_exception 的middleware。
它的工作原理是这样的:您在查看时引发异常(例如 ImmediateHttpResponse)。如果您的中间件捕获了异常,则中间件返回响应,在您的情况下,状态为 400。如果您没有捕获异常,Django 将在最后捕获它,返回状态 500(服务器错误),或其他状态。
最简单的例子是捕获 Http404 的中间件。如果您在中间件中捕获异常 Http404,您可以返回任何您想要的响应(状态 200、400 等)。如果您没有捕获(即中间件的 process_exception 方法返回 None),Django 将为您捕获它并返回状态为 404 的响应。这实际上是您想要响应的自定义异常的标准方式一种自定义方式。
【讨论】:
是的,我知道this solution。【参考方案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
【讨论】:
这是一个HttpResponse
类,我需要一个例外,我可以在任何地方提出它,而不仅仅是在视图中
Django 以一种特殊的方式处理django.http.Http404
异常,渲染404
模板。我想要另一个特殊异常,它将向客户端返回带有给定消息的400
响应。我可以定义一个自定义异常并编写一个中间件,该中间件将捕获它呈现400
响应,但我想知道 Django 中是否已经存在这样的东西。
这正是HttpResponseBadRequest
的用途;因为它是一个普通的HttpResponse
,你可以用它发回任何额外的有效载荷。
我可以使用HttpResponseBadRequest
,但是我需要将逻辑放入视图中。我不想触摸视图,我想在任何级别引发异常。
在模型中加入ImmediateHttpResponse
异常与在视图中加入逻辑相同。你的模型不应该知道实现层(HTTP?TCP?为什么重要?),所以你应该只创建你自己的异常(例如,NotAllowedOperation
),然后你的视图会捕获这个异常并返回一个@ 987654346@.以上是关于Django 是不是有立即 http 响应的例外情况?的主要内容,如果未能解决你的问题,请参考以下文章
Django - 重定向回页面显示http响应(Json数据)而不是呈现