DataTables服务器端处理-回显draw()参数(Python / Flask)

时间:2018-09-04 12:34:04

标签: python ajax flask datatables

我正在使用DataTables显示来自MySQL的数据。一切正常,直到被迫使用服务器端处理(100k行)。现在,当我在浏览器中加载表时,在使用DataTables的某些功能(搜索,列排序..)之前,它可以正常工作。当我点击例如列名称,我得到的只是“正在处理...”消息。

我注意到,每次单击表时,XMLHttpRequest中的绘制都会增加1,但是我的代码中的“ draw”仍然设置为1。

我对draw,recordsTotal,records的定义已在python / flask代码中过滤(缩短):

tick = table.query.all()
rowsCount = table1.query.count()

x = {'draw':1,'recordsTotal':rowsCount,'recordsFiltered':10}
y = dict(data=[i.serialize for i in tick])
z = y.copy()
z.update(x)

@app.route("/api/result")
def result_json():
    return jsonify(z)

@app.route('/data')
def get_data():
    return render_template('data.html')

我的JSON:

{
  "data": [
    {
      "first": "Anton",
      "id": 1,
      "last": "Spelec"
    },
    {
      "first": "Rosamunde",
      "id": 2,
      "last": "Pilcher"
    },
    {
      "first": "Vlasta",
      "id": 3,
      "last": "Burian"
    },
    {
      "first": "Anton",
      "id": 4,
      "last": "Bernolak"
    },
    {
      "first": "Willy",
      "id": 5,
      "last": "Wonka"
    }
  ],
  "draw": 1,
  "recordsFiltered": 5,
  "recordsTotal": 5
}

我的带有DataTables初始化的html页面:

<script>

        $(document).ready(function() {
           $('#table_id').DataTable( {
              "processing": true,
              "serverSide": true,
              "paging": true,
              "pageLength": 10,
              "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
              "ajax": {
               url: 'api/result',
                },
              columns: [
               { "data": "id" },
               { "data": "first" },
               { "data": "last" }
                ]
           } );
        } );

</script>
 <table id="table_id">
                <thead>
                        <tr>
                                <th>id</th>
                                <th>first</th>
                                <th>last</th>
                        </tr>
                </thead>
 </table>

XHR在这里:

  

请求网址:   http://10.10.10.12/api/result?draw=7&columns%5B0%5D%5Bdata%5D=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=first&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=last&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&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=0&length=10&search%5Bvalue%5D=asdf&search%5Bregex%5D=false&_=1536075500781

DataTables documentation建议将此参数转换为整数并将其发送回。 我发现有关draw参数的question类似,但应该是相同的,但是不幸的是我无法使其正常工作。我认为,将参数强制转换为整数不是问题,但是我迷失了下一步的工作或如何将凸起的draw参数推入JSON。

谢谢。

2 个答案:

答案 0 :(得分:1)

如果DataTables正在将draw的新值发送到您的服务器-只需读取该值并将其发送回即可:

@app.route("/api/result")
def result_json():
    return jsonify(z)

可能刚刚成为(如果DataTables以其他方式发送值,则调整代码):

@app.route("/api/result")
def result_json():
    z.update({'draw': request.form.get('draw')})
    return jsonify(z)

我并不是要解决您的代码似乎对过滤或搜索没有任何作用,但至少它为您提供了一个构建的起点。

更新

从您粘贴的XHR代码中-好像DataTables正在通过查询字符串传递值-因此request.args.get('draw')将是访问draw数据值的方式。

答案 1 :(得分:1)

draw参数仅由DataTables使用,以确保DataTables按顺序绘制从服务器端处理请求返回的Ajax。要使用排序,过滤和分页之类的功能,您将必须设置自己的系统,该系统根据使用服务器端处理时Datatables传递的已发送参数来查询数据。

默认参数为here。您还可以通过操纵ajax调用中的数据对象,将自己的自定义参数包括到该对象中。