2008-09-04 54 views
11

我坚信后端和前端之间紧密耦合的邪恶思想:我想要在生成用户界面时自动使用关于后端的现有隐含知识。例如,如果一个VARCHAR列的最大长度为20个字符,那么图形用户界面应该自动限制用户在相关表单字段中键入超过20个字符。用于紧密DB/GUI耦合的Python Web应用程序框架?

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

我已经看了一下Python数据库框架,我想我可以总结SQLAlchemy最适合我的心态。

现在,我需要找到一个Web应用程序框架,它自然适合SQLAlchemy(或等价的),甚至可能与我的耦合胃口。随着 “Web应用程序框架”,我的意思是产品/项目如Pyhons,Django的,TurboGears中,web2py会等

例如,它理论上应能:

  • 自动选择合适的表单控件数据输入给定列如果被告知这样做;例如,如果列对于具有10个不同值的列具有外键,则窗口小部件应该显示10个可能的值作为下拉
  • 自动生成javascript窗体验证代码这给出了最终用户快速错误反馈,如果串被输入到一个字段,它是关于在一个整数列,最终等
  • 自动生成数据的日历插件这将在DATE列结束
  • 暗示NOT NULL约束如JavaScript它在相关的输入字段中抱怨空的或空白的数据
  • 产生相匹配相关的(简单)CHECK约束 JavaScript验证代码
  • 使其易于避免SQL注入,通过使用准备的语句和/或从外部获得的数据的验证
  • 使其易于避免跨站脚本通过自动跳脱传出字符串时适当
  • 化妆使用约束名称的产生,以防constrataint违反有些用户友好的错误消息

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

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

回答

3

你应该看看django,特别是它的newformsadmin模块。newforms模块为服务器端验证提供了一个很好的可能性,可为用户自动生成错误消息/页面。添加阿贾克斯验证也possible

+0

Django与SQLAlchemy很好地玩吗?最后我听说,Django + SA分支已经垂死,原来的问题将SA指定为选择的ORM。 – 2008-12-08 05:23:55

1

我相信,Django模型不支持组合主键(见documentation)。但也许你可以在Django中使用SQLAlchemy? A google search表示可以。我没有使用过Django,所以我不知道。

我建议你看看:

我没有任何上述项目的任何深刻的认识。我只是在尝试添加类似于我自己的应用程序的东西,正如原始问题提到的那样。以上列表仅仅是我偶然发现的一些有趣的项目。

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

如果原题的作者找到一个解决方案,运作良好,请更新或回答此线程。

1

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

我们从来没有设法找到一个框架,不正是我们想要的不妥协,宁愿让所有为我们工作的权利,写胶水我们的自我位。

第1步对于每个数据类型sqlAlchemy.types.INTEGER等添加一个额外的函数toHtml(或很多也许toHTMLReadOnly,toHTMLAdmin编辑任何),只是有返回模板的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>

使用这个基本的方法,并将pythons内省扩展到它的潜力,在下午我设法创建了读取更新和删除数据库的整个管理部分的代码,尚未与django的波兰语,但更好,足够好我的需求。

第3步发现需要第三步就在星期五,想上传文件,你知道需要更多的只是varchar数据类型默认文本框。没有汗水,我只是将我的表定义中的行类从VARCHAR覆盖到FilePath(VARCHAR),唯一的区别是FilePath有一个不同的toHtml方法。完美无瑕地工作。所有这一切说,如果有一个收缩包装一个那里做你想要的,就用它。

声明:此代码是在午夜后从内存中写入,可能不会产生运行的网页。

5

的web2py做了大部分的你问:

基于字段类型及其验证它会呈现场与适当的小部件。您可以覆盖

db.table.field.widget=... 

并使用第三方小部件。

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

验证器有IS_EMPTY_OR(...)

DAL防止SQL注入,因为在数据库中执行时,everthing会被转义。

的web2py防止XSS因为在{{=可变}}, '变量' 被转义,除非另外指明{{= XML(变量)}}或{{= XML(变量,消毒=真)}}

错误消息例如是

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

T是国际验证的参数。