11

我坚信后端和前端之间紧密耦合的异端思想:我希望在生成用户界面时自动使用有关后端的现有隐含知识。例如,如果 VARCHAR 列最多包含 20 个字符,则 GUI 应自动限制用户在相关表单字段中键入超过 20 个字符。

而且我对想要定义我的数据库表的 ORM 有强烈的反感,或者基于一些 hack,因为 ORM,每个表都需要有额外的数字 ID 列。

我对 Python 数据库框架进行了一些研究,我认为我可以得出结论,SQLAlchemy 最适合我的心态。

现在,我需要找到一个 Web 应用程序框架,它自然地适合 SQLAlchemy(或等效的),甚至可能适合我对耦合的胃口。“Web 应用程序框架”是指产品/项目,例如 Pyhons、Django、TurboGears、web2py 等。

例如,理想情况下它应该能够:

  • 如果被告知这样做,则自动为输入给定列的数据选择合适的表单小部件;例如,如果该列具有与具有 10 个不同值的列的外键,则小部件应将 10 个可能的值显示为下拉列表
  • 自动生成 javascript 表单验证代码,如果将字符串输入到即将出现在 INTEGER 列中的字段等,则会向最终用户提供快速错误反馈
  • 为数据自动生成一个日历小部件,该小部件将在 DATE 列中结束
  • 提示 NOT NULL 约束作为 javascript,它抱怨相关输入字段中的空数据或纯空格数据
  • 生成与相关(简单) CHECK-constraints匹配的 javascript 验证代码
  • 通过使用准备好的语句和/或验证外部派生数据,可以轻松避免 SQL 注入
  • 通过在适当时自动转义传出的字符串,可以轻松避免跨站点脚本
  • 使用约束名称来生成对用户友好的错误消息,以防违反约束

所有这些都应该动态发生,因此表格调整会自动反映在前端 - 可能使用缓存机制,因此所有模型自省都不会影响性能。换句话说,我不想在 XML 文件(或类似文件)中重复我的模型定义,因为它已经在我的数据库中仔细定义了。

Python(或任何语言,就此而言)是否存在这样的框架?如果不是:如果我要自己添加上述功能的一部分,那么几个 Python Web 应用程序框架中的哪一个将是最少的?

4

5 回答 5

5

web2py 完成了您所要求的大部分工作:

基于字段类型及其验证器,它将使用适当的小部件呈现该字段。您可以覆盖

db.table.field.widget=...

并使用第三方小部件。

web2py 有 js 来阻止用户在整数字段中输入非整数或在双字段中输入非双精度。时间、日期和日期时间字段有自己的选择器。这些 js 验证与(而不是)服务器端验证一起使用。

IS_EMPTY_OR(...)验证器。

DAL 可以防止 SQL 注入,因为在进入数据库时​​所有内容都会被转义。

web2py 防止 XSS,因为在 {{=variable}} 中,“变量”被转义,除非另有说明 {{=XML(variable)}} 或 {{=XML(variable,sanitize=True)}}

例如,错误消息是验证器的参数

db.table.field.requires=IS_NOT_EMPTY(error_message=T('hey! write something in here'))

T 代表国际化。

于 2008-10-13T17:31:38.343 回答
3

你应该看看 django,尤其是它的新表单管理模块。newforms 模块提供了一个很好的可能性来进行服务器端验证,并为用户自动生成错误消息/页面。添加ajax验证也是可能的

于 2008-09-04T09:12:27.613 回答
1

TurboGears当前默认使用SQLObject,但您可以将其与SQLAlchemy一起使用。他们说 TurboGears (1.1) 的下一个主要版本将默认使用 SQLAlchemy。

于 2008-09-07T10:03:48.647 回答
1

我知道你具体要求一个框架,但我想我会让你知道我在这里做什么。我刚刚将我公司的 Web 应用程序从自定义的内部 ORM 层转换为 sqlAlchemy,所以我远不是专家,但我想到的是 sqlAlchemy 具有它从数据库映射的所有属性的类型,所以为什么不使用它来帮助将正确的 html 输出到页面上。所以我们使用 sqlAlchemy 作为后端,Cheetah 模板作为前端,但中间的一切基本上都是我们自己的。

我们从来没有设法找到一个框架,它可以在不妥协的情况下完全满足我们的要求,并且更愿意得到所有适合我们的部分并自己编写胶水。

第 1 步。对于每种数据类型 sqlAlchemy.types.INTEGER 等。添加一个额外的函数 toHtml(或者许多可能是 toHTMLReadOnly,toHTMLAdminEdit 等等),然后让它返回 html 的模板,现在你甚至不必关心什么数据如果您只想吐出您可以做的整个表格(作为猎豹模板或您的模板引擎是什么),请输入您的显示。

第2步

<table>

<tr>

#for $field in $dbObject.c:

<th>$field.name</th>

#end for

</tr>

<tr>

#for $field in dbObject.c:

<td>$field.type.toHtml($field.name, $field.value)</td>

#end for

</tr>

</table>

使用这种基本方法并将 python 内省扩展到其潜力,在一个下午,我设法为 out 数据库的整个管理部分创建了读取更新和删除代码,虽然还没有 django 的完善,但已经足够满足我的需要了。

第 3 步在星期五发现需要进行第三步,想要上传文件,如您所知,这些文件需要的不仅仅是 varchar 数据类型默认文本框。没有汗水,我只是将表定义中的行类从 VARCHAR 覆盖到 FilePath(VARCHAR) ,唯一的区别是 FilePath 有不同的 toHtml 方法。完美地工作。

综上所述,如果有一个收缩包装的产品可以满足您的需求,请使用它。

免责声明:此代码是在午夜后从内存中编写的,可能不会生成正常运行的网页。

于 2008-09-07T14:39:14.803 回答
1

我相信 Django 模型不支持复合主键(参见文档)。但也许你可以在 Django 中使用 SQLAlchemy?谷歌搜索表明您可以。我没有用过Django,所以我不知道。

我建议你看看:

我对上述任何项目都没有任何深入的了解。我只是在尝试添加类似于我自己的应用程序之一的东西,就像原始问题提到的那样。上面的列表只是我偶然发现的有趣项目的列表。

至于 Python 的 Web 应用程序框架,我推荐 TurboGears 2。并不是说我对任何其他框架有任何经验,我只是喜欢 TurboGears...

如果原始问题的作者找到了一个行之有效的解决方案,请更新或回答此线程。

于 2008-09-04T09:42:10.333 回答