You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask无需AJAX调用直接传数据给DataTables无数据显示问题求助

问题:Flask直接传递数据给DataTables无内容显示

我想结合Flask和DataTables实现可排序表格,但不想用API调用,而是直接用后端返回的字典列表渲染。目前后端能返回数据,但前端表格只显示表头,没有内容。

后端路由代码

@application.route('/users', methods=['GET', 'POST'])
def eshop():
    result = None
    users= None
    counter = 0
    user_listJson= None
    if request.method == 'POST':
        user_input = request.form['user_input']
        users,counter = get_users(user_input)
        result = "Users found: {}".format(counter)
        user_listJson= jsonify(data=users) if users else None
    return render_template('users.html', result=result, user_listJson=user_listJson)

前端模板代码

{% extends "base.html" %}
{% block content %}
    <div class="container mt-5">
    <form method="POST" onsubmit="showLoading()" class="mb-3">
        <div class="input-group">
            <input type="text" name="user_input" class="form-control">
            <button type="submit" class="btn btn-primary">Submit</button>
        </div>
    </form>
    <h3 id="loading" style="display: none;">Loading . . .</h3>
    {% if result %}
        <h3>{{ result }}</h3>
        <h4>They are:</h4>
        <table id="data" class="table table-striped">
            <thead>
            <tr>
                <th>First</th>
                <th>Last</th>
                <th>Email</th>
            </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
    {% endif %}
{% endblock %}

{% block scripts %}
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdn.datatables.net/v/bs5/jq-3.7.0/dt-1.13.8/r-2.5.0/datatables.min.js"></script>
    <script>
        $(document).ready(function () {
            var userList={{ user_listJson}};

            $('#data').DataTable({
                data: userList, // Use the JSON data directly
                columns: [
                    {data: 'First'},
                    {data: 'Last'},
                    {data: 'Email'}
                ],
            });
        });
    </script>
{% endblock %}

解决方案

核心问题

jsonify返回的是Flask响应对象(包含HTTP头信息),不是纯JSON字符串,直接渲染到JS中会导致语法错误,浏览器控制台能看到类似Unexpected token &的报错。

步骤1:修改后端路由,传递原始数据列表

@application.route('/users', methods=['GET', 'POST'])
def eshop():
    result = None
    users = None
    counter = 0
    if request.method == 'POST':
        user_input = request.form['user_input']
        users, counter = get_users(user_input)
        result = "Users found: {}".format(counter)
    # 直接传递原始users列表,而非jsonify生成的响应对象
    return render_template('users.html', result=result, users=users)

步骤2:修改前端模板,用tojson过滤器处理数据

{% extends "base.html" %}
{% block content %}
    <div class="container mt-5">
    <form method="POST" onsubmit="showLoading()" class="mb-3">
        <div class="input-group">
            <input type="text" name="user_input" class="form-control">
            <button type="submit" class="btn btn-primary">Submit</button>
        </div>
    </form>
    <h3 id="loading" style="display: none;">Loading . . .</h3>
    {% if result %}
        <h3>{{ result }}</h3>
        <h4>They are:</h4>
        <table id="data" class="table table-striped">
            <thead>
            <tr>
                <th>First</th>
                <th>Last</th>
                <th>Email</th>
            </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
    {% endif %}
{% endblock %}

{% block scripts %}
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdn.datatables.net/v/bs5/jq-3.7.0/dt-1.13.8/r-2.5.0/datatables.min.js"></script>
    <script>
        $(document).ready(function () {
            {% if users %}
                // 使用Flask内置的tojson过滤器安全转换Python对象为JSON
                var userList = {{ users|tojson }};
                $('#data').DataTable({
                    data: userList,
                    columns: [
                        {data: 'First'},
                        {data: 'Last'},
                        {data: 'Email'}
                    ],
                });
            {% endif %}
        });
    </script>
{% endblock %}

关键说明

  • tojson过滤器会自动处理Python数据到JSON的转换,同时处理引号转义、特殊字符等问题,生成合法的JS对象。
  • 增加{% if users %}判断,避免无数据时执行DataTables初始化代码,减少不必要的错误。

内容的提问来源于stack exchange,提问作者Brandon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:23:15