【问题标题】:Return JSON object to View with Flask and Ajax使用 Flask 和 Ajax 将 JSON 对象返回给 View
【发布时间】:2014-12-17 15:05:30
【问题描述】:

我正在尝试使用 AJAX 将 python 字典返回到视图并从 JSON 文件中读取,但到目前为止我只返回 [object Object],[object Object]...

如果我检查网络流量,我确实可以看到正确的数据。

这就是我的代码的样子。我有一个基于所选 ID(请求参数方法)的类和方法,将打印特定数据。它从 python 酌情获取数据。问题不在这里,已经测试过了。但以防万一我会链接它。

# 创建方向的方法 - 以防万一#

def getCourselist_byClass(self, classid):
        """
        Getting the courselist by the class id, joining the two tables. 
        Will only get data if both of them exist in their main tables.
        Returning as a list.
        """
        connection = db.session.connection()
        querylist = []
        raw_sql = text("""
           SELECT
                course.course_id,
                course.course_name
            FROM
                course
            WHERE
                EXISTS(
                    SELECT 1
                    FROM
                        class_course_identifier
                    WHERE
                        course.course_id = class_course_identifier.course_id
                    AND EXISTS(
                        SELECT 1
                        FROM
                            class
                        WHERE
                            class_course_identifier.class_id = class.class_id
                        AND class.class_id = :classid
                    )
                )""")
        query = connection.engine.execute(raw_sql, {'classid': classid})
        for column in query:
            dict = {
                'course_id'     : column['course_id'],
                'course_name'   : column['course_name']
            }
            querylist.append(dict)

        return querylist

我的 jsonify 路由方法

@main.route('/task/create_test')
def get_courselist():
    #objects
    course = CourseClass()
    class_id = request.args.get('a',  type=int)    
    #methods
    results = course.getCourselist_byClass(class_id)
    return jsonify(result=results)

HTML

这是输入字段的外观以及它应该链接数据的位置。

<input type="text" size="5" name="a">
        <span id="result">?</span>
        <p><a href="javascript:void();" id="link">click me</a>

然后我这样称呼它

<script type=text/javascript>
    $(function() {
        $('a#link').bind('click', function() {
          $.getJSON("{{ url_for('main.get_courselist') }}", {
            a: $('input[name="a"]').val()
          }, function(data) {
            $("#result").text(data.result);
          });
          return false;
        });
    });
  </script>

但每次我在字段中输入一个 ID 号时,我都会得到正确的数据。但它的格式不正确。而是像 [object Object] 一样打印它

来源,以本指南为灵感:flask ajax example

【问题讨论】:

    标签: python ajax json flask


    【解决方案1】:

    你的服务器返回的数据是这样的:{result: [{course_id: 'xxx', course_name: 'xxx'}]},其中data.result是一个JS数组。

    设置为$("#result").text()时,JS将数组转为字符串,所以结果为[object Object]

    您应该遍历数组以构造一个字符串,然后在 DOM 中设置该字符串,例如:

    courseStr = data.result.map(function(course) {return course.course_id + '-' +   course.course_name; }).join(',');
    $("#result").text(courseStr);
    

    【讨论】:

      【解决方案2】:

      flask.json.jsonify 的 API 描述表明它需要关键字参数。您实际想要做的似乎是序列化包含字典的列表对象,您是否尝试过flask.json.dumps?假设您已导入 dumps 符号,而不是您的 jsonify 调用,您可以尝试:

      return dumps(results)
      

      【讨论】:

      • 您好,当我尝试转储时。我没有得到 DOM 的任何东西,但我可以在“网络”下看到它正在获取 JSON 对象。
      • .getJSON 回调中,我认为您仍在寻找入站JSON 中的result 属性(从您使用jsonify 时返回)。也许改用$("#result").text(data);
      • 感谢@rchang,但似乎我遇到了与 jsonify 相同的错误。仍然得到 [object Object]
      • 作为替代方案,也许可以尝试 Python 的内置 json 模块。它也提供了一个接受对象的dumps 方法。我知道我之前已经成功地使用它来序列化字典列表(尽管这不在 Flask 项目中)。 docs.python.org/2/library/json.html 的文档用于 Python 2.7 和docs.python.org/3.3/library/json.html 用于 Python 3.3
      • 非常感谢@rchang,我需要阅读更多关于如何序列化的信息!我对编程和 python 还是很陌生。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 2015-05-23
      • 2018-01-13
      • 2015-02-02
      • 2017-10-22
      相关资源
      最近更新 更多