DataTables服务器端处理echo back draw()参数(Python/Flask)

2024-09-30 01:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我注意到,每次单击表,XMLHttpRequest中的draw都会提升1,但代码中的“draw”仍然设置为1。在

我对draw、recordsTotal、recordsFiltered in 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:

^{pr2}$

带数据表的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在这里:

Request URL: 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,并且假设是相同的,但不幸的是,我无法使其工作。我认为,将参数转换为integer不是问题,但我不知道下一步该怎么做,或者如何将引发的draw参数推送到JSON中。在

谢谢。在


Tags: 代码apiidfalsetruedata参数table
2条回答

如果DataTables正在向服务器发送draw的新值,请读取该值并将其发送回:

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

可能会变成(如果DataTables以其他方式发送值,请调整代码):

^{pr2}$

我并不是说,你的代码似乎与过滤或搜索无关,但至少它给了你一个构建的起点。在

更新

从粘贴的XHR代码来看,数据表似乎是通过查询字符串传递值的,因此request.args.get('draw')将是访问draw数据值的方法。在

draw参数仅由DataTables使用,以确保从服务器端处理请求返回的Ajax按顺序由DataTables绘制。要使用诸如排序、筛选和分页等功能,您必须根据使用服务器端处理时Datatables传递的发送参数设置自己的查询数据系统。在

默认参数是here。您还可以通过在ajax调用中操作数据对象来为该对象包含您自己的自定义参数。在

相关问题 更多 >

    热门问题