python - flask + 数据表 : how do you read the AJAX request that DataTables sends as JSON?

标签 python jquery json ajax flask

我创建了一个 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-typeapplication/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/

相关文章:

java - 为什么 jsonParser.getCodec().readTree(jsonParser).asText() 为我返回一个空字符串?

python - python 批量将 json 转换为 csv

java - Jackson Java 到 JSON 对象映射器修改字段名称

python - pySerial 程序停止正常工作

python - 如何自定义Folium中的LayerControl?

javascript - 一个输入的多个标签上的复选框动画

javascript - 通过 Ajax 发送文本框数组值

python - 如何在 python 中使用 numpy 获取具有最多给定元素的二维矩阵(列表)中的列和行的索引

python - 如何根据登录用户保留 Django Rest Framework Serializer 中的特定属性?

javascript - 替换backbone.js中的undefined