一种用于紧密数据库/图形用户界面耦合的Python web应用框架?
我坚信后端和前端之间应该紧密结合:我希望在生成用户界面时,能够自动利用已有的后端知识。比如,如果一个VARCHAR列的最大长度是20个字符,那么相关的表单字段应该自动限制用户输入超过20个字符。
我对那些想要定义我数据库表的ORM(对象关系映射)工具非常反感,或者那些因为ORM而需要每个表都有额外数字ID列的黑科技。
我稍微研究了一下Python的数据库框架,觉得SQLAlchemy最符合我的想法。
现在,我需要找一个与SQLAlchemy(或类似工具)自然契合的web应用框架,可能还要符合我对紧密结合的需求。这里的“web应用框架”指的是像Django、TurboGears、web2py等这样的产品或项目。
例如,它理想情况下应该能够:
- 自动选择合适的表单控件,用于输入特定列的数据;比如,如果某列有一个外键指向一个有10个不同值的列,那么控件应该显示这10个可能的值作为下拉菜单。
- 自动生成JavaScript表单验证代码,这样用户在输入一个字符串到即将存入INTEGER列的字段时,可以快速收到错误反馈。
- 自动生成一个日历控件,用于输入将存入DATE列的数据。
- 提示NOT NULL约束,通过JavaScript检查相关输入字段是否为空或只包含空格。
- 生成与相关的(简单)CHECK约束匹配的JavaScript验证代码。
- 方便避免SQL注入,通过使用预处理语句和/或验证外部数据。
- 方便避免跨站脚本攻击,在适当的时候自动转义输出字符串。
- 利用约束名称生成用户友好的错误信息,以便在违反约束时显示。
所有这些都应该是动态发生的,因此表的调整会自动反映在前端——可能还需要一个缓存机制,以免所有的模型反射影响性能。换句话说,我不想在XML文件(或类似文件)中重复定义我的模型,因为它已经在数据库中仔细定义过了。
有没有这样的框架存在于Python(或其他语言)中?如果没有:在众多Python web应用框架中,哪个框架在我自己添加上述功能时会最不受阻碍?
5 个回答
我觉得Django的模型不支持复合主键(可以查看文档)。不过,也许你可以在Django中使用SQLAlchemy?通过谷歌搜索,似乎是可以的。我没有用过Django,所以不太清楚。
我建议你看看:
- ToscaWidgets
- DBSprockets,里面还有DBMechanic
- Catwalk。Catwalk是一个用于TurboGears 1.0的应用,使用的是SQLObject,而不是SQLAlchemy。你还可以看看这篇博客文章和这个视频。
- FastData。同样使用SQLObject。
- formalchemy
- Rum
我对以上项目没有深入的了解。我只是想在自己的一个应用中添加一些类似于原问题提到的功能。上面的列表只是我偶然发现的一些有趣项目。
至于Python的网页应用框架,我推荐TurboGears 2。并不是说我对其他框架有经验,只是我比较喜欢TurboGears...
如果原问题的作者找到一个有效的解决方案,请更新或回复这个讨论。
web2py可以满足你大部分的需求:
根据字段的类型和验证规则,它会用合适的控件来显示这个字段。你也可以通过
db.table.field.widget=...
来使用第三方的控件。
web2py有一些JavaScript代码,可以阻止用户在整数字段中输入非整数的值,或者在双精度字段中输入非双精度的值。时间、日期和日期时间字段都有自己的选择器。这些JavaScript验证是和服务器端验证一起工作的,而不是替代它。
还有一个叫做 IS_EMPTY_OR(...)
的验证器。
DAL(数据库抽象层)可以防止SQL注入,因为所有进入数据库的数据都会被转义。
web2py可以防止跨站脚本攻击(XSS),因为在{{=variable}}中,'variable'会被转义,除非你特别指定{{=XML(variable)}}或{{=XML(variable,sanitize=True)}}。
错误信息是验证器的参数,例如
db.table.field.requires=IS_NOT_EMPTY(error_message=T('hey! write something in here'))
T是为了国际化。