我创建了一个 Flask 应用程序,它:
- 从不同的事件源读取事件;
- 将这些事件保存到数据库;和
- 允许用户使用 DataTables 1.10.20 搜索这些事件。
我正在尝试:
- 每当用户尝试搜索表格时,读取 DataTables 通过 AJAX 请求传递给 Flask 后端的参数;和
- 将这些参数翻译成字典,以便在执行服务器端过滤时使用它们。
这是我在 DataTables 中创建的表的代码:
$(document).ready(function() {
events_table_template = {
"scrollX": true,
"pageLength": 10,
"processing": true,
"serverSide": true,
"ajax": {
"url": "/ajax/events",
"type": "POST",
"dataType": "json",
"dataSrc": "data",
"contentType": "application/json"
},
"columns": [
{"data": "event_id"},
{"data": "event_type"},
{"data": "event_timestamp"},
{"data": "event_name"},
]
};
var table = $('#events-table').DataTable(events_table_template);
});
我已经尝试在 DataTables 配置中显式返回 JSON:
$(document).ready(function() {
events_table_template = {
...
"ajax": {
...
"data": function(args){
return {"args": JSON.stringify(args)};
}
};
var table = $('#events-table').DataTable(events_table_template);
});
这是 Flask 服务器上的 AJAX 端点:
from mycode import EventService
from flask import Blueprint
import flask
blueprint = Blueprint('events-ajax', __name__, url_prefix='/ajax/')
@blueprint.route('/events/', methods=["POST"])
def get_events():
print("Request data", flask.request.data)
print("Request form", flask.request.form)
api = EventService()
events = api.get_events_via_database()
rows = []
for event in api.get_events_via_database():
rows.append({
'event_id': event.event_id,
'event_type': event.type,
'event_timestamp': event.timestamp,
'event_name': event.name,
})
response = {
'data': rows,
'recordsTotal': len(events),
'recordsFiltered': len(events),
'draw': 1,
}
return flask.jsonify(response)
我注意到:
flask.request.data
返回一堆 URL 编码的文本:Request data b'draw=1&columns%5B0%5D%5Bdata%5D=event_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=host_id&columns%5B1%5D%5B...
flask.request.form
返回一个ImmutableMultiDict
对象:ImmutableMultiDict([])
我尝试过:
使用这些函数读取 AJAX 请求的内容:
flask.request.data
flask.request.form
flask.request.json
flask.request.get_json(force=True)
将 DataTables 方面的
content-type
从application/json
更改为application/json; charset=utf-8
如何将 AJAX 请求读取为 JSON?
最佳答案
- 从
"ajax"
配置 block 中删除"contentType": "application/json"
;和 - 使用
flask.request.form
读取 AJAX 请求中存在的参数映射。
数据表:
$(document).ready(function() {
events_table_template = {
"scrollX": true,
"pageLength": 10,
"processing": true,
"serverSide": true,
"ajax": {
"url": "/ajax/events",
"type": "POST",
"dataType": "json",
"dataSrc": "data",
},
"columns": [
{"data": "event_id"},
{"data": "event_type"},
{"data": "event_timestamp"},
{"data": "event_name"},
]
};
var table = $('#events-table').DataTable(events_table_template);
});
flask :
@blueprint.route('/events/', methods=["POST"])
def get_events():
parameters = dict(flask.request.form)
关于python - flask + 数据表 : how do you read the AJAX request that DataTables sends as JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59218529/