Обработка данных на стороне сервера в DataTables - отображение параметра back draw () (Python / Flask) - PullRequest
0 голосов
/ 04 сентября 2018

Я использую DataTables для отображения данных из MySQL. Это работало нормально, пока я не был вынужден использовать обработку на стороне сервера (100 тыс. Строк). Теперь, когда я загружаю таблицу в браузер, она работает нормально, пока я не использую некоторые функции DataTables (поиск, сортировка по столбцам ..). Когда я нажимаю, например, на Имя столбца, все, что я получил, это сообщение "Обрабатывается ...".

Я заметил, что при каждом щелчке по таблице ничья повышается на 1 в XMLHttpRequest, но моя «ничья» все еще имеет значение 1 в моем коде.

Мое определение ничьей, recordsTotal, recordsFiltered в коде python / flask (сокращено):

tick = table.query.all()
rowsCount = table1.query.count()

x = {'draw':1,'recordsTotal':rowsCount,'recordsFiltered':10}
y = dict(data=[i.serialize for i in tick])
z = y.copy()
z.update(x)

@app.route("/api/result")
def result_json():
    return jsonify(z)

@app.route('/data')
def get_data():
    return render_template('data.html')

Мой JSON:

{
  "data": [
    {
      "first": "Anton",
      "id": 1,
      "last": "Spelec"
    },
    {
      "first": "Rosamunde",
      "id": 2,
      "last": "Pilcher"
    },
    {
      "first": "Vlasta",
      "id": 3,
      "last": "Burian"
    },
    {
      "first": "Anton",
      "id": 4,
      "last": "Bernolak"
    },
    {
      "first": "Willy",
      "id": 5,
      "last": "Wonka"
    }
  ],
  "draw": 1,
  "recordsFiltered": 5,
  "recordsTotal": 5
}

Моя HTML-страница с инициализацией DataTables:

<script>

        $(document).ready(function() {
           $('#table_id').DataTable( {
              "processing": true,
              "serverSide": true,
              "paging": true,
              "pageLength": 10,
              "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
              "ajax": {
               url: 'api/result',
                },
              columns: [
               { "data": "id" },
               { "data": "first" },
               { "data": "last" }
                ]
           } );
        } );

</script>
 <table id="table_id">
                <thead>
                        <tr>
                                <th>id</th>
                                <th>first</th>
                                <th>last</th>
                        </tr>
                </thead>
 </table>

XHR здесь:

Запросить URL: http://10.10.10.12/api/result?draw=7&columns%5B0%5D%5Bdata%5D=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=first&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=true&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=last&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=true&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=0&length=10&search%5Bvalue%5D=asdf&search%5Bregex%5D=false&_=1536075500781

Документация по DataTables советует привести этот параметр к целому числу и отправить его обратно. Я нашел похожий вопрос о параметре draw, и он предположил то же самое, но, к сожалению, я не могу заставить его работать. Преобразование параметра в целочисленное значение не будет проблемой, я думаю, но я заблудился в том, что делать с ним дальше или как передать параметр рендеринга в моем JSON.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Параметр draw используется только в DataTables, чтобы гарантировать, что Ajax-запросы от запросов обработки на стороне сервера будут отрисовываться последовательно в DataTables. Чтобы использовать такие функции, как сортировка, фильтрация и разбиение по страницам, вам необходимо настроить собственную систему запросов данных на основе отправленных параметров, которые передаются в Datatables при использовании обработки на стороне сервера.

Параметры по умолчанию здесь . Вы также можете включить свои собственные параметры в этот объект, манипулируя объектом данных в вызове ajax.

0 голосов
/ 04 сентября 2018

Если DataTables отправляет новое значение для draw на ваш сервер - просто прочитайте это значение и отправьте его обратно:

@app.route("/api/result")
def result_json():
    return jsonify(z)

Может стать (изменить код, если DataTables отправляет значения другим способом):

@app.route("/api/result")
def result_json():
    z.update({'draw': request.form.get('draw')})
    return jsonify(z)

Я не говорю о том, что ваш код, похоже, ничего не делает с фильтрацией или поиском, но, по крайней мере, он дает вам отправную точку для сборки.

Обновление

Из кода XHR, который вы вставили - похоже, DataTables передает значения через строки запросов - поэтому request.args.get('draw') будет способом доступа к этому draw значению данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...