【问题标题】:Flask + DataTables: how do you read the AJAX request that DataTables sends as JSON?Flask + DataTables:如何读取 DataTables 作为 JSON 发送的 AJAX 请求?
【发布时间】:2019-12-06 18:31:40
【问题描述】:

我创建了一个 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)
  • 将数据表中的 content-typeapplication/json 更改为 application/json; charset=utf-8

如何将 AJAX 请求读取为 JSON?

【问题讨论】:

    标签: python jquery json ajax flask


    【解决方案1】:
    • "ajax" 配置块中删除"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);
    });
    

    烧瓶

    @blueprint.route('/events/', methods=["POST"])
    def get_events():
        parameters = dict(flask.request.form)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多