如何使用Flask处理jQuery DataTables发送的服务器端参数?

8 投票
2 回答
6743 浏览
提问于 2025-04-18 14:16

我在处理通过 jQuery 数据表 1.10 发送的参数时遇到了一些问题,特别是在启用了服务器端处理的情况下。我在 JavaScript 端这样初始化了数据表:

var table = $('#mytable').DataTable( {
                "processing": true,
                "serverSide": true,
                "ajax": {
                    'url': url,
                    'type': 'POST'
                },
                "columns": data
            } );

然后我在基于 Flask 的服务器中使用这个来接收 POST 请求:

@app.route('/data/<data_key>', methods=['POST'])
def get_data(data_key):
    print request.form

    # do some processing here in order to filter data
    # ...

    return Response(json.dumps(data), status=200, mimetype='application/json')

为了过滤数据,我尝试查看 request.form,但结果很奇怪,无法轻松转换成对象数组。我得到的结果像这样:

ImmutableMultiDict(
[
('columns[0][data]', u'ReportDate'), 
('draw', u'1'),
('columns[1][name]', u''), 
('columns[1][data]', u'FundName'),
('columns[0][orderable]', u'true'), 
('columns[1][searchable]', u'true'), 
('columns[1][orderable]', u'true'), 
('order[0][column]', u'0'), 
('columns[0][name]', u''), 
('order[0][dir]', u'asc'), 
('search[value]', u''), 
('columns[1][search][regex]', u'false'), 
('columns[0][search][value]', u''), 
('search[regex]', u'false'), 
('columns[1][search][value]', u''), 
('columns[0][search][regex]', u'false'), 
('start', u'0'), 
('length', u'10'), 
('columns[0][searchable]', u'true')
]
)

在 jQuery 数据表的文档中,他们提到:

发送到服务器的 order[i] 和 columns[i] 参数是信息的数组:

order[i] - 是一个数组,定义了有多少列在排序,也就是说,如果数组的长度是 1,那就是单列排序;如果长度大于 1,那就是多列排序。

columns[i] - 是一个数组,定义了表格中的所有列。

在这两种情况下,i 是一个整数,会变化以指示数组的值。在大多数现代服务器端脚本环境中,这些数据会自动以数组的形式提供给你。

然而,Flask 提供的数据是一个简单的字典,有没有简单的方法把它转换成对象数组呢?

2 个回答

1

你可以使用我找到的这个很方便的小工具,链接在这里:https://github.com/bernii/querystring-parser

from querystring_parser import parser
args = parser.parse(request.query_string)
print args['columns']
12

让DataTable发送json数据

ajax: {
    url: "/api/data_table",
    type: "POST",
    data: function ( args ) {
      return { "args": JSON.stringify( args ) };
    }
},

在flask中解析这个json数据

args = json.loads(request.values.get("args"))
columns = args.get("columns")

撰写回答