python - DataTables - Python/Flask 中的服务器端处理 - 无法连接到服务器端脚本
问题描述
我为此苦苦挣扎了好几天。我正在尝试为我现有的项目实施 Sergio Llanna 的服务器端解决方案。
这是我的实现:
不同之处在于,我的解决方案从 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 项目,所以我不确定。谢谢你的任何建议。
使用的技术:OS Debian 9、DB MariaDB 10、Flask-SQLAlchemy
解决方案
与原始文件相比,我有点不清楚您到底做了什么更改,所以我继续尝试将 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上修改后的 repo 。
推荐阅读
- python - 根据另一列查找公共列值
- mongodb - 如何在 mongodb 中检查日期 $gte 是否为 'dd.mm.YYYY' 日期格式
- ios - iOS 启动故事板中的许多 id 仅显示一个简单的居中图像的目的是什么?
- c - 剪刀石头布游戏的无效输入代码不接受良好的输入
- java - scons和java,如何处理package-info.java
- sql - 寻找永远在一起的员工
- algorithm - 堆中公式 n/2^h+1 的确切含义是什么?
- python - 生成 0 到 10 之间数字的 sha1 校验和的 Python 代码
- javascript - 如何将对象转换为按对象键分组
- c# - 保留级联 CheckedListBox 中项目的检查状态