DataTables - обработка на стороне сервера в Python / Flask - не работает подключение к серверному сценарию - PullRequest
0 голосов
/ 10 сентября 2018

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

Обработка данных на сервере в Sergio

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

My DataTables на стороне сервера

Разница в том, что мое решение собирает данные из базы данных MySQL вместо локального файла. Я думаю, что я достаточно близок, чтобы заставить его работать, данные из базы данных отображаются в таблице правильно. Когда я отключаю параметр serverSide, сортировка и поиск работают нормально, но когда я его включаю, каждый раз, когда я нажимаю на столбец, выполняю поиск или что-то еще, я получаю только «Обработка ...» Режим отладки 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, Колба-SQLAlchemy

1 Ответ

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

Мне было немного неясно, что именно вы изменили по сравнению с исходными файлами, поэтому я попытался добавить поддержку 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 .

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