【问题标题】:How to get only json value using jquery from calling an API?如何使用 jquery 从调用 API 中仅获取 json 值?
【发布时间】:2018-04-18 07:23:22
【问题描述】:

API 返回 JSON 并渲染模板,当我调用 $.getJSON 时,它只会返回该渲染模板而不是 JSON 值。这个我试过了

 if request.args['type'] == 'json':
    return json.dumps(group)
 else:
    return render_template("/c.., summary=json.dumps(group))

但它说

错误的请求

有什么方法可以让我在需要时获取该 JSON 值?

这是我的看法

@cms.route('/add/asset/<client_id>', methods=["GET"])
@login_required
def asset_add(client_id):
    if int(current_user.id_) == int(client_id):
        group = {}
        group['id'] = []
        group['pid'] = []
        group['name'] = []
        for index in range(len([r.id_ for r in db.session.query(Assetgroup.id_)])):
            for asset in (Assetgroup.query.filter_by(parent_id=(index or ''))):
                group['id'].append(asset.id_)
                group['pid'].append(asset.parent_id)
                group['name'].append(asset.name)
        if request.args['type'] == 'json':
            return json.dumps(group)
        else:
            return render_template("/cms/asset_add.html", action="/add/asset", asset=None,
                               client_id=client_id, 
                               types=Type.query.all())
    else:
        return 'permission denied'

这是我的 ajax 请求

$(document).ready(function () {
                                $('#group_id').click(function () {
                                    $.getJSON(
                                        '/add/asset/' + {{ client_id }},
                                        function (data) {
                                            $('#group_id').find('option').remove();
                                            var len = data.id.length;
                                            for (var i = 0; i < len; i++) {
                                                var option_item = '<option value="' + data.id[i] + '">' + data.name[i] + "</option>";
                                                $('#group_id').append(option_item);
                                            }
                                        }
                                    );
                                });
                            });

【问题讨论】:

  • 更多信息会有所帮助。
  • 整个烧瓶视图。 AJAX 调用、输入数据、所需输出。
  • @pissall 你想让你的视图函数同时返回 html 和 json 吗?我认为你的观点回报很好。您确定将正确的 get 参数传递给您的视图吗?像这样localhost:5000/test?type=json
  • @RajaSimon 我想查看整个视图。以及 AJAX 调用,看看它是否正确接收。
  • 在获取请求中通过type 并且仍然如果您没有收到json,那么我可能会误解您的问题。您能否至少显示 ajax 调用和@pissall 询问的整个视图

标签: python jquery json flask


【解决方案1】:

您可以在html调用中添加参数以获取json结果...

即)

const Endpoint = '/add/asset/?'

$.getJSON(Endpoint, {type: 'json'}).done(function(data...)

【讨论】:

  • 它仍然显示错误请求。
  • 好的,现在你可以检查一下终端,看看你在 GET 方法中得到了 type=json 吗?
  • 127.0.0.1 - - [18/Apr/2018 14:57:34] "GET /add/asset/1 HTTP/1.1" 400 -
  • 好的,我看到了client_id,这很好。现在请把import pdb; pdb.set_trace()放在if语句开启后,然后运行服务器。这将启用调试模式并按下n,接下来让我们看看错误发生在哪里。只是为了调试。
  • 也许我会制作另一个视图并从中返回 json。这将非常简单易行。
【解决方案2】:

我相信这就是你要找的东西

http://flask.pocoo.org/docs/0.12/api/#flask.Request.is_json

这是一个flask方法,检查请求是否为json

然后你可以在flask中使用jsonify来返回json(你需要导入它)

from flask import  jsonify

所以你的代码变成了

if request.is_json:
     return jsonify(group)

希望你发现它有用且更优雅

一种更简单的调试方法是仅返回 json 以开始查看响应在浏览器中的外观。所以你可以去掉 login required (假设你还没有投入生产),不要检查请求是否是_json,然后调用 api 并查看它返回的内容。所以假设你的客户 ID 是 1

@cms.route('/add/asset/<client_id>', methods=["GET"])
def asset_add(client_id):
    if int(current_user.id_) == int(client_id):
        group = {}
        group['id'] = []
        group['pid'] = []
        group['name'] = []
        for index in range(len([r.id_ for r in db.session.query(Assetgroup.id_)])):
            for asset in (Assetgroup.query.filter_by(parent_id=(index or ''))):
                group['id'].append(asset.id_)
                group['pid'].append(asset.parent_id)
                group['name'].append(asset.name)

        return jsonify(group)

现在您可以访问http://yoursite.com/add/asset/1查看您的回复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多