Jquery DataTables(服务器端)在第一次请求时正常,但失败,返回“0”;搜索或重新排序时请求中的[Object";]
使用serverSide=true的DataTables jQuery插件(这里的示例很小,但最终我们希望处理大量记录)。在初始请求(第一页加载)时,一切正常。DataTable看起来很棒,它包含了预期的数据 请求信息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''),
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" }
]
});
});