我正在修改Flask + Datatables + Mongo以创建测试网络应用。我正在使用Datatables'在服务器端数据模式下,它在请求数据中发送的参数如下:
columns[0][data]
columns[1][name]
columns[1][orderable]
columns[3][data]
columns[2][orderable]
columns[3][searchable]
order[0][dir]
columns[1][search][regex]
columns[3][orderable]
columns[0][search][value]
columns[2][searchable]
columns[3][search][regex]
columns[0][search][regex]
start
columns[0][searchable]
draw
columns[2][search][value]
columns[2][search][regex]
columns[1][data]
order[0][column]
columns[1][searchable]
columns[0][name]
columns[2][data]
columns[0][orderable]
search[value]
columns[3][name]
_
search[regex]
columns[1][search][value]
columns[2][name]
length
columns[3][search][value]
举个例子,我希望能够访问"命令"列出要做的事情
len(order)
要查看列表中有多少项,但我无法理解,因为Flask将每个参数视为单独的项而不是列表。有没有办法安全地解决这个问题?
在Datatables文档(https://datatables.net/manual/server-side)中,它说:"在大多数现代服务器端脚本环境中,这些数据将自动作为数组提供给您。"
提前感谢您提供的任何帮助。
答案 0 :(得分:0)
没有看到任何实际的代码,很难肯定地说,但我的信念是,你的代码类似于
order = request.args.get('order')
len(order)
了解此处发生的事情的关键是request.args
。它是MultiDict
,由Werkzeug提供的数据结构。
正如文档所述,MultiDict
旨在处理共享相同密钥的多个值。那么为什么你的代码没有用呢?
MultiDict.get
返回与键匹配的第一个值。要获取所有值,您需要使用MultiDict.getlist
方法。
order = request.args.getlist('order')
len(order)
答案 1 :(得分:0)
所以,我能够通过简单地告诉Datatables在发送之前将POST转换为JSON来解决这个问题。然后我只用Python解析JSON,我得到了想要的结果。
发送JSON的数据表初始化如下所示:
ajax: {
url: 'myUrl',
data: function ( d ) {
return { 'd': JSON.stringify( d ) };
}
}
代码从此处翻录:https://github.com/DataTables/DataTables/issues/311
从安全角度来看这可能很糟糕,但我只是为了我自己的本地用途开发这个应用程序,所以我不太担心。