【问题标题】:Django HttpResponse renders html when content_type='application/json'当 content_type='application/json' 时 Django HttpResponse 呈现 html
【发布时间】:2015-08-18 09:27:00
【问题描述】:

我想用 jquery 对 django 视图进行 ajax 调用。此视图查询外部 API,然后返回结果。我正在尝试返回数据并在 ajax 调用的成功回调中对其进行操作,但我得到的是一个呈现的 html 网站,显示响应的内容。这是我的代码。

我的表格:

<form class="form-inline" method="get" action="/search/">
    <div class="input-group">
        <input type="text" class="form-control" id="search" name="search" placeholder="Search">
    </div>
    <button id="btn-search" class="btn btn-default" type="submit">SEARCH</button>
</form>

我的 ajax 调用:

$('#btn-search').click(function() {
        var params = {
            'query': $('#search').val()
        }
        $.ajax({
            data: params,
            url: JS_URLS['search'],
            type: 'get',
            success: function (data) {
                alert("SUCCESS");
            },
            error: function (data) {
                alert("ERROR");
            }
        });
})

我的看法:

def search(request):
    if request.GET:
        params = {
            'name'   : request.GET['search'],
        }
        encoded_params = urllib.urlencode(params)
        response = execute_request(url)
        return HttpResponse(json.dumps(response), content_type='application/json')

我得到了什么:

显然,响应没有返回到 ajax 函数,因为我没有在成功和错误回调中设置警报消息。

【问题讨论】:

  • 如果#searcha 元素,则需要阻止默认操作。你在做这个吗?
  • 您是否尝试过以其他方式调用 url,例如从浏览器或 curl?

标签: ajax json django


【解决方案1】:

作为您发送的数据params,其中有query 作为关键字,而不是search。因此,您可能会收到 KeyError,因为您的查询字符串中没有设置 search。这会返回一个 Django 的黄色错误页面,即 html。 并检查http://api.jquery.com/jquery.getjson/

【讨论】:

    【解决方案2】:

    通过GET 提交表单会在您的浏览器中引发重新加载事件。

    您必须阻止表单的默认行为,这样做的正确位置是表单元素本身。

    给你的表单一个 ID:

    <form id="mysearchform" class="form-inline" method="get" action="/search/">
        <div class="input-group">
            <input type="text" class="form-control" id="search" name="search" placeholder="Search">
        </div>
        <button id="btn-search" class="btn btn-default" type="submit">SEARCH</button>
    </form>
    

    将 javascript 更改为:

    $("#mysearchform").submit(function(e){
           e.preventDefault(); 
           var params = {
                'query': $('#search').val()
            }
            $.ajax({
                data: params,
                url: JS_URLS['search'],
                type: 'get',
                success: function (data) {
                    alert("SUCCESS");
                },
                error: function (data) {
                    alert("ERROR");
                }
            });
        return false;
    });
    

    这里重要的是防止进一步执行默认的表单提交行为。 e.preventDefault()return false 照顾好这个。

    你根本不需要表格来做你想做的事:

        <div class="input-group">
            <input type="text" class="form-control" id="search" name="search" placeholder="Search">
        </div>
        <button id="btn-search" class="btn btn-default">SEARCH</button>
    

    将 javascript 更改为:

    $("#btn-search").click(function(e){
            $.ajax({
                url: JS_URLS['search']+'?query='+$('#search').val(),
                type: 'get',
                success: function (data) {
                    alert("SUCCESS");
                },
                error: function (data) {
                    alert("ERROR");
                }
            });
        return false;
    });
    

    这也可以在表单中使用,但不要将type="submit" 放在上面。

    【讨论】:

    • "通过 POST 提交表单会导致浏览器中的重新加载事件。"我没有使用 post 提交表单。我已经尝试了您的代码,并且得到了相同的行为。我仍然认为问题出在服务器端。 ajax 调用正在正确执行,我在 django 视图中收到了必要的信息,但是当我使用“return HttpResponse(json.dumps(response), content_type='application/json')”返回值时,响应呈现为空仅返回 json 的页面。对于我在 Django 文档中可以阅读的内容,将 content_type 设置为 application/json 应该可以完成这项工作。
    • 100% 不在服务器端。服务器不可能将非 ajax 调用转换为 ajax 调用,反之亦然。
    • 放弃表格,它会导致问题。
    • 我已将代码简化为我能想到的最简单的代码,但还是一样。在 ajax 调用中,我没有传递参数(因此我没有使用表单中的任何内容)。在我的 django 视图中,我正在使用我知道它有效的硬编码 url 查询外部 api。我仍然可以在附加图像中的页面上呈现响应。
    猜你喜欢
    • 2019-12-02
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2021-10-01
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多