DataTables-Python / Flask中的服务器端处理-无法正常连接到服务器端脚本

时间:2018-09-10 09:20:18

标签: python flask datatables

我为此苦了几天。我正在尝试将Sergio Llanna的服务器端解决方案实施到我现有的项目中。

Sergio's DataTables server-side processing

这是我的实现:

My DataTables server-side processing

区别在于,我的解决方案从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项目,所以我不确定。 谢谢您的任何建议。

使用的技术: OS Debian 9 DB MariaDB 10, Flask-SQLAlchemy

1 个答案:

答案 0 :(得分:0)

对我来说,与原始文件相比,您究竟做了什么更改尚不清楚,所以我继续尝试将SQLAlchemy支持添加到Sergio的原始项目中。

__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上的修改后的仓库。