Jquery DataTables(服务器端)在第一次请求时正常,但失败,返回“0”;搜索或重新排序时请求中的[Object";]

Jquery DataTables(服务器端)在第一次请求时正常,但失败,返回“0”;搜索或重新排序时请求中的[Object";],jquery,python,ajax,flask,datatables,Jquery,Python,Ajax,Flask,Datatables,使用serverSide=true的DataTables jQuery插件(这里的示例很小,但最终我们希望处理大量记录)。在初始请求(第一页加载)时,一切正常。DataTable看起来很棒,它包含了预期的数据 请求信息 Request method = GET Request args = ImmutableMultiDict([('draw', u'1'), ('columns[0][data]', u'client_user_id'), ('columns[1][name]', u''),

使用serverSide=true的DataTables jQuery插件(这里的示例很小,但最终我们希望处理大量记录)。在初始请求(第一页加载)时,一切正常。DataTable看起来很棒,它包含了预期的数据

请求信息

Request method = GET
Request args = ImmutableMultiDict([('draw', u'1'), ('columns[0][data]', u'client_user_id'), ('columns[1][name]', u''), ('columns[5][searchable]', u'true'), ('columns[5][name]', u''), ('columns[4][search][regex]', u'false'), ('columns[1][orderable]', u'true'), ('columns[4][orderable]', u'true'), ('columns[5][orderable]', u'true'), ('columns[2][orderable]', u'true'), ('columns[4][name]', u''), ('order[0][dir]', u'asc'), ('columns[1][search][regex]', u'false'), ('columns[3][name]', u''), ('columns[0][search][value]', u''), ('columns[2][searchable]', u'true'), ('columns[3][search][regex]', u'false'), ('extra_search', u'test'), ('columns[0][search][regex]', u'false'), ('columns[5][data]', u'last_login'), ('start', u'0'), ('columns[4][searchable]', u'true'), ('columns[0][searchable]', u'true'), ('columns[5][search][value]', u''), ('columns[3][searchable]', u'true'), ('columns[2][search][value]', u''), ('columns[2][search][regex]', u'false'), ('columns[1][data]', u'status'), ('columns[1][searchable]', u'true'), ('columns[5][search][regex]', u'false'), ('columns[0][orderable]', u'true'), ('columns[4][data]', u'client_id'), ('columns[0][name]', u''), ('columns[2][data]', u'lastname'), ('columns[3][data]', u'email_address'), ('search[value]', u''), ('columns[3][orderable]', u'true'), ('_', u'1484145221101'), ('columns[4][search][value]', u''), ('search[regex]', u'false'), ('columns[1][search][value]', u''), ('order[0][column]', u'0'), ('columns[2][name]', u''), ('length', u'10'), ('columns[3][search][value]', u'')])
127.0.0.1 - - [11/Jan/2017 09:33:41] "GET /client/rou/ajax/mwe?draw=1&columns%5B0%5D%5Bdata%5D=client_user_id&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=true&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=status&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=true&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=lastname&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=true&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=email_address&columns%5B3%5D%5Bname%5D=&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=true&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B4%5D%5Bdata%5D=client_id&columns%5B4%5D%5Bname%5D=&columns%5B4%5D%5Bsearchable%5D=true&columns%5B4%5D%5Borderable%5D=true&columns%5B4%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B4%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B5%5D%5Bdata%5D=last_login&columns%5B5%5D%5Bname%5D=&columns%5B5%5D%5Bsearchable%5D=true&columns%5B5%5D%5Borderable%5D=true&columns%5B5%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B5%5D%5Bsearch%5D%5Bregex%5D=false&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=0&length=10&search%5Bvalue%5D=&search%5Bregex%5D=false&extra_search=test&_=1484145221101 HTTP/1.1" 200 -
…并从服务器返回数据。但是,与DataTable的任何交互(例如,单击列标题对结果进行排序,或在搜索框中键入内容)和后续ajax请求如下所示:

尝试搜索或排序时请求信息

Request method = GET
Request args = ImmutableMultiDict([('[object Object]', u''), ('_', u'1484145221102')])
127.0.0.1 - - [11/Jan/2017 09:33:46] "GET /client/rou/ajax/mwe?[object%20Object]&_=1484145221102 HTTP/1.1" 200 -
$(document).ready(function () {

    $('#mwe_table').DataTable({
        processing: true,
        serverSide: true,
        ajax: {
            method: 'GET',
            url: '/client/rou/ajax/mwe',
        },
        "columns": [
            { "data": "client_user_id" },
            { "data": "status" },
            { "data": "lastname" },
            { "data": "email_address" },
            { "data": "client_id" },
            { "data": "last_login" }
        ]
    });
}); 
为什么在第一种情况下,我们得到所有的参数,在第二种情况下,我们得到[Object]?为了使DataTables发出有效的请求,需要进行哪些更改

Python(使用烧瓶)

HTML(头部)


JavaScript控制台中未报告任何错误。

我无法使用指定的参数进行复制,但我认为我可能有解决方法。您可以显式地告诉DataTables如何序列化请求数据

例如:

$(document).ready(function () {

    $('#mwe_table').DataTable({
        processing: true,
        serverSide: true,
        ajax: {
            url: '/client/rou/ajax/mwe',
            data: function (d) {
                console.log(d); // display all properties to console
                return jQuery.param({
                    start: d.start,
                    length: d.length,
                    orderColumn: d.order[0].column,
                    orderDir: d.order[0].dir,
                    draw: d.draw
                });
            }
        },
        "columns": [
            { "data": "client_user_id" },
            { "data": "status" },
            { "data": "lastname" },
            { "data": "email_address" },
            { "data": "client_id" },
            { "data": "last_login" }
        ]
    });
});

注意,我通过使用
jQuery.param()
将JavaScript对象序列化到
application/x-www-form-urlencoded
中,有选择地发送一些参数。为了简单起见,JavaScript对象只有简单的属性,没有嵌套的对象或数组。调用
jQuery.param()
可能是不必要的,但我保留了它以明确说明。

这可能不会解决您的问题,但是
recordsTotal
recordsFiltered
在这种情况下应该是相同的。根据文档,
recordsFiltered
应该是应用筛选后的记录总数,而不仅仅是此数据页返回的记录数。谢谢
<table class="table display" id="mwe_table">
    <thead>
        <tr>
            <th>User ID</th>
            <th>Status</th>
            <th>Last name</th>
            <th>Email</th>
            <th>Client ID</th>
            <th>Last login</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>
<script type="text/javascript" src="https://cdn.datatables.net/v/bs/dt-1.10.13/datatables.min.js"></script>
$(document).ready(function () {

    $('#mwe_table').DataTable({
        processing: true,
        serverSide: true,
        ajax: {
            method: 'GET',
            url: '/client/rou/ajax/mwe',
        },
        "columns": [
            { "data": "client_user_id" },
            { "data": "status" },
            { "data": "lastname" },
            { "data": "email_address" },
            { "data": "client_id" },
            { "data": "last_login" }
        ]
    });
}); 
$(document).ready(function () {

    $('#mwe_table').DataTable({
        processing: true,
        serverSide: true,
        ajax: {
            url: '/client/rou/ajax/mwe',
            data: function (d) {
                console.log(d); // display all properties to console
                return jQuery.param({
                    start: d.start,
                    length: d.length,
                    orderColumn: d.order[0].column,
                    orderDir: d.order[0].dir,
                    draw: d.draw
                });
            }
        },
        "columns": [
            { "data": "client_user_id" },
            { "data": "status" },
            { "data": "lastname" },
            { "data": "email_address" },
            { "data": "client_id" },
            { "data": "last_login" }
        ]
    });
});