【问题标题】:how to send a failure response from django to ajax如何将失败响应从 django 发送到 ajax
【发布时间】:2016-10-10 14:52:44
【问题描述】:

我有这个 Ajax 请求:

    $.ajax({
            url: "my_url",
            headers: {'X-CSRFToken': '{{ csrf_token }}'},
            type: "post",
            data:{x:1
                 },
            success: function(response, textStatus, xhr) {
                alert(response + textStatus + xhr);

            },
            error: function(xhr, ajaxOptions, thrownError) {
                alert(xhr.status + ' Error: ' + thrownError);
            }
          });

}

在 Django 方面,我有时想传播错误。
如果我引发异常,它将作为 500 响应内部错误传播。
但我想显示一条错误消息。 所以我尝试了

return HttpResponse("Bad permissions", status=500)

但我无法捕获自定义错误消息。 有什么想法吗?


对于那些想知道什么有效的人:

模板中的Javascript

function send(){
    $.ajax({
            url: "/get_pens/",
            headers: {'X-CSRFToken': '{{ csrf_token }}'},
            type: "post",
            data:{x:1
                 },
            dataType: "json",
            success: function(response, textStatus, xhr) {
                alert('Success: ' + response + textStatus + xhr);

            },
            error: function(xhr, ajaxOptions, thrownError) {
                alert(xhr.status + ' Error: ' + xhr.responseJSON['err']);
            }
          });
}

views.py

​​>
def get_pens(request):
    pens = []
    response = HttpResponse(json.dumps({'pens': pens, 'err': 'some custom error message'}), 
        content_type='application/json')
    response.status_code = 400
    return response

【问题讨论】:

  • 你不能只发送一个像{'status': 'success'}{'status': 'the custom error message'}这样的json并在status不是success时显示错误消息吗?
  • 500 在这里并不合适。这要么是错误请求 (400),要么是无效权限的特定情况下,403。请参阅 here
  • 您是否捕捉正在发生的异常?除非您这样做,否则它永远不会到达您的HttpResponse 或您正在使用的任何东西。
  • 我可以发送一个响应,例如一个 json 响应并检查是否有错误键,但这听起来像是一个错误的方法。我认为正确的方法应该是使用响应状态,但我不知道如何。
  • alert(....)works。但是您是否尝试将消息添加到 div $('#some-id').html(xhr.responseJSON['err'])

标签: ajax django


【解决方案1】:

一种方法可以解决这个问题,

您在块周围的代码周围有适当的尝试异常块,这些块容易引发异常。有很多 Exception 子类可以涵盖引发的异常类型,例如。模型.DoesNotExist。在这些异常块中,您只需创建适当的 HttpResponse 并将其发送回来。这里举个例子吧。

class DemoView(View):
    def post(self, request, oid, *args, **kwargs):
    try:
        object = Model.objects.get(id=oid)
    except Model.DoesNotExist:
        return HttpResponseNotFound('error message')

这样,您的错误块将在您的 ajax 函数中执行。您可能会认为这是一种方法,对我来说似乎是一种正确的方法。

更新: 根据您(OP)在下面发表的评论,您可以按照以下方式创建回复

def bad_request(message):
    response = HttpResponse(json.dumps({'message': message}), 
        content_type='application/json')
    response.status_code = 400
    return response

当您想要返回状态 400 时,您只需这样做,

return bad_request(message='This is a bad request')

因此,在您的 ajax 错误函数中,您可以使用以下功能来获取该消息,

xhr.responseJSON.message

【讨论】:

  • 我试过了,但在 ajax 端我仍然没有收到自定义错误消息。
  • 我已根据您的评论更新了我的答案。
  • 我没有尝试使用 status_code 而是通过在构造函数中设置状态来尝试它,就像我在上面的原始帖子中一样,我告诉你,出于某种奇怪的原因,在 ajax 方面它没有进入错误块。相反,它仍然进入成功块。
  • @RajeshYogeshwar 如果添加了 status_code,则警告消息有效,但在 $('#some-id').html(xhr.responseJSON.message) 之类的 div 中显示消息则无效。
  • @Boky 应该没有什么不同。因为xhr.responseJSON.message 基本上返回一个字符串,而('#some-id').html(xhr.responseJSON.message) 应该是这样。如果可能的话,你能分享你的 sn-p 吗?
【解决方案2】:

这里是 Django 3.0 和 Python 3.0 的版本。先定义JsonResponse的子类:

class FailedJsonResponse(JsonResponse):
    def __init__(self, data):
        super().__init__(data)
        self.status_code = 400

在你自己的代码中使用它:

return FailedJsonResponse({"e": "Error message"})

【讨论】:

    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多