问题 用于紧密DB / GUI耦合的python Web应用程序框架?


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

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

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

现在,我需要找到一个自然适合SQLAlchemy(或等价物)的Web应用程序框架,甚至可能还有我对耦合的兴趣。使用“Web应用程序框架”,我的意思是产品/项目,如Pyhons,Django,TurboGears,web2py等。

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

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

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

是否存在Python(或任何语言)的框架?如果不是:如果我自己添加上述部分功能,那么几个Python Web应用程序框架中哪一个最不会受到影响?


10869
2017-09-04 08:53


起源



答案:


web2py完成了你提出的大部分内容:

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

db.table.field.widget=...

并使用第三方小部件。

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

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代表国际化。


5
2017-10-13 17:31





你应该看看django,特别是它 newforms 和 管理 模块。 newforms模块提供了一种很好的可能性,可以通过自动生成用户的错误消息/页面来进行服务器端验证。添加ajax验证也是 可能 


3
2017-09-04 09:12



虽然Django与SQLAlchemy的搭配很好吗?最后我听说,Django + SA分支奄奄一息,最初的问题指出SA是首选的ORM。 - Tim Lesher


答案:


web2py完成了你提出的大部分内容:

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

db.table.field.widget=...

并使用第三方小部件。

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

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代表国际化。


5
2017-10-13 17:31





你应该看看django,特别是它 newforms 和 管理 模块。 newforms模块提供了一种很好的可能性,可以通过自动生成用户的错误消息/页面来进行服务器端验证。添加ajax验证也是 可能 


3
2017-09-04 09:12



虽然Django与SQLAlchemy的搭配很好吗?最后我听说,Django + SA分支奄奄一息,最初的问题指出SA是首选的ORM。 - Tim Lesher


的TurboGears 目前使用 SQLObject的 默认情况下,您可以使用它 SQLAlchemy的。他们说TurboGears(1.1)的下一个主要版本默认使用SQLAlchemy。


1
2017-09-07 10:03





我知道你的特殊性要求一个框架,但我想我会告诉你我在这里遇到的问题。我刚刚经历了将我公司的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>

使用这个基本方法并将蟒蛇内省展示为其潜力,在一个下午我设法为我们整个数据库的管理部分创建读取更新和删除代码,还没有django的润色,但更多的足够我的需要。

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

所有这一切,如果有一个收缩包裹在那里做你想要的,使用它。

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


1
2017-09-07 14:39





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

我建议你看看:

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

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

如果原始问题的作者找到了运行良好的解决方案,请更新或回答此主题。


1
2017-09-04 09:42