bp256r1
bp256r1

Reputation: 301

Flask + DataTables: how do you read the AJAX request that DataTables sends as JSON?

I've created a Flask application which:

I'm trying to:

Here is the code for the table I created in 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);
});

I've tried explicitly returning JSON within the DataTables configuration:

$(document).ready(function() {
    events_table_template = {
...
    "ajax": {
...
        "data": function(args){
            return {"args": JSON.stringify(args)};
        }
    };
    var table = $('#events-table').DataTable(events_table_template);
});

Here is the AJAX endpoint on the Flask server:

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)

I've noticed that:

I've tried to:

How do you read the AJAX request as JSON?

Upvotes: 3

Views: 4009

Answers (1)

bp256r1
bp256r1

Reputation: 301

  • Remove "contentType": "application/json" from the "ajax" configuration block; and
  • Use flask.request.form to read the map of parameters present within the AJAX request.

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",
        },
        "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)

Upvotes: 3

Related Questions