Datatables - обработка на стороне сервера в python / flask - не работает соединение с серверным скриптом

Бьюсь с этим несколько дней. Я пытаюсь внедрить серверное решение Серджио Лланны в свой существующий проект.

Обработка на стороне сервера Sergio's DataTables

и это моя реализация:

Обработка на стороне сервера My DataTables

Разница в том, что мое решение захватывает данные из базы данных MySQL, а не из локального файла. Я думаю, что я довольно близок к тому, чтобы это заработало, данные из базы данных отображаются в таблице правильно. Когда я выключаю опцию serverSide, сортировка и поиск работают нормально, но когда я включаю ее, каждый раз, когда я нажимаю на столбец, поиск или что-то еще, я получаю просто «Обработка ...» Включен режим отладки Flask. В инструментах разработки браузера или на сервере разработки Flask нет ошибок.

Мой JSON XHR (ответ):

{
  "data": [
    {
      "cola": "Hello", 
      "colb": "How is it going", 
      "colc": 1, 
      "cold": 4
    }, 
    {
      "cola": "Sample text", 
      "colb": "Another sample", 
      "colc": 2, 
      "cold": 9
    }, 
    {
      "cola": "Kurnik hosi", 
      "colb": "Guten tag", 
      "colc": 3, 
      "cold": 3
    }, 
    {
      "cola": "Achiles", 
      "colb": "Patus", 
      "colc": 4, 
      "cold": 1
    }, 
    {
      "cola": "Kim", 
      "colb": "Kiduk", 
      "colc": 5, 
      "cold": 8
    }, 
    {
      "cola": "Pastina", 
      "colb": "Zavada", 
      "colc": 6, 
      "cold": 9
    }, 
    {
      "cola": "Dolna", 
      "colb": "Marikova", 
      "colc": 7, 
      "cold": 9
    }
  ], 
  "draw": 1, 
  "recordsFiltered": 10, 
  "recordsTotal": 7
}

Думаю, проблема в запросе, отправленном из браузера, но это мой первый проект Python / Flask, поэтому я не уверен. Спасибо за любой совет.

Используемые технологии: ОС Debian 9, БД MariaDB 10, Flask-SQLAlchemy

0
0
1 464
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне было немного непонятно, что именно вы изменили по сравнению с исходными файлами, поэтому я пошел дальше и попытался добавить поддержку SQLAlchemy в исходный проект Серджио.

__init__.py изменения:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

flask_app = Flask(__name__)
db = SQLAlchemy(flask_app)

from app.mod_tables.models import TableBuilder, SomeTable, add_some_random_db_entries
db.create_all()
add_some_random_db_entries()
table_builder = TableBuilder()

models.py изменения:

from app.mod_tables.serverside.serverside_table import ServerSideTable
from app.mod_tables.serverside import table_schemas
from app import db

DATA_SAMPLE = [
    {'A': 'Hello!', 'B': 'How is it going?', 'C': 3, 'D': 4},
    {'A': 'These are sample texts', 'B': 0, 'C': 5, 'D': 6},
    {'A': 'Mmmm', 'B': 'I do not know what to say', 'C': 7, 'D': 16},
    {'A': 'Is it enough?', 'B': 'Okay', 'C': 8, 'D': 9},
    {'A': 'Just one more', 'B': '...', 'C': 10, 'D': 11},
    {'A': 'Thanks!', 'B': 'Goodbye.', 'C': 12, 'D': 13}
]

class SomeTable(db.Model):
    __tablename__ = 'some_table'
    cola = db.Column('A', db.String(2))
    colb = db.Column('B', db.String(2))
    colc = db.Column('C', db.Integer, primary_key=True)
    cold = db.Column('D', db.Integer)

    def __init__(self, cola, colb, colc, cold):
        self.cola = cola
        self.colb = colb
        self.colc = colc
        self.cold = cold

    @property
    def serialize(self):
        return {
             'A': self.cola,
             'B': self.colb,
             'C': self.colc,
             'D': self.cold
        }


def add_some_random_db_entries():
    letters = 'arstarstarstarstaars'
    for i in range(10):
        item = SomeTable(letters[i], letters[i + 1: i + 3], i, i + 1)
        db.session.add(item)
    db.session.commit()


def make_data_sample_from_db():
    newlist = []
    for row in SomeTable.query.all():
        newlist.append(row.serialize)
    return newlist


class TableBuilder(object):

    def collect_data_clientside(self):
        return {'data': DATA_SAMPLE}

    def collect_data_serverside(self, request):
        columns = table_schemas.SERVERSIDE_TABLE_COLUMNS
        data = make_data_sample_from_db()
        return ServerSideTable(request, data, columns).output_result()

Вы должны иметь возможность просто добавить URL-адрес базы данных, и он должен работать так же оттуда.

Однако этот метод получения отфильтрованных результатов довольно неэффективен, особенно с большими базами данных. Это подходит только для небольших баз данных, потому что вам нужно запрашивать всю таблицу и фильтровать ее с помощью словарей.

Я бы, наверное, посмотрел flask-admin. Он имеет много встроенных в сам пакет фильтров, использующих поддержку фильтрации SQLAlchemy, что означает, что это намного быстрее, чем этот подход.

Вот модифицированное репо на github.

Йост, спасибо. Я пытаюсь реализовать серверное решение, чтобы сделать его быстрее. Намного быстрее, чем с циклом for для записи данных в таблицу. Я использовал цикл for для нескольких сотен строк без режима обработки на стороне сервера. Теперь у меня 30 тыс. Строк, и на создание таблицы уходит 40 секунд, и это бесполезно. В ближайшее время будет около 150 тысяч строк. Обработка на стороне сервера используется для отображения больших таблиц в Интернете (миллионы строк), поэтому мне нужно это реализовать. К сожалению, в DataTables нет доступных серверных скриптов flask / python. Только PHP :(

culter 10.09.2018 13:09

Это будет не намного быстрее из-за того, как это реализовал Серджио. Получение всех данных с последующей их фильтрацией просто неэффективно (поэтому у вас есть SQL). Я бы действительно посоветовал заглянуть в админку фляги. Он чрезвычайно мощный и имеет множество функций, которые также есть в таблицах данных (я активно использовал оба). Проверьте некоторые из примеров.

Joost 10.09.2018 13:35

Спасибо. Я ожидал, что есть только один способ реализовать обработку на стороне сервера DataTables, и каждый раз, когда она делает новый запрос для каждого представления, что происходит быстро. Я просто смотрю видео на YouTube о flask-admin, но у меня нет в этом опыта.

culter 10.09.2018 13:52

Пожалуйста, подумайте, подходит ли flask-admin для моих нужд? Мне нужно отобразить данные из таблицы mysql со 150 тыс. Строк. Мне нужно отсортировать столбцы и добавить фильтры (много флажков). Затем мне нужно экспортировать отфильтрованные данные в различные форматы (такая функция есть в DataTables). Когда я нажимаю на отфильтрованную строку, мне нужно развернуть «подменю» с другой информацией из базы данных (информация из других таблиц). Не могли бы вы рассказать мне, какие части моих потребностей достижимы с помощью flask-admin и разумно ли перейти с DataTables? Я посвятил DataTables около 2 месяцев :(

culter 10.09.2018 13:54

Хм, это очень специфическая проблема. В этом случае я бы, вероятно, остановился на таблицах данных. Однако я бы НЕ использовал ответ Серджио. Просто позвольте пользователю установить все фильтры одновременно, затем сохраните фильтры, установленные пользователем, а затем используйте SomeTable.query.filter_by(col1=user_inputted_filter, col2=user_inputted_filter2).all() или что-то подобное, чтобы получить соответствующие результаты.

Joost 10.09.2018 14:06

Спасибо, Джуст. Я перешел с python на php. Теперь базовая функциональность работает, и я думаю, что на php будет гораздо больше примеров, чем на python.

culter 12.09.2018 12:01

Другие вопросы по теме