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

时间:2020-03-05 18:47:30  来源:igfitidea点击:

我坚信后端与前端之间紧密耦合的异端思想:我希望在生成用户界面时自动利用有关后端的现有隐式知识。例如,如果VARCHAR列的最大值为20个字符,则GUI应该会自动限制用户在相关的表单字段中键入20个以上的字符。

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

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

现在,我需要找到一个Web应用程序框架,该框架自然适合SQLAlchemy(或者等效版本),甚至适合我的耦合需求。 " Web应用程序框架"是指产品/项目,例如Pyhons,Django,TurboGears,web2py等。

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

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

所有这些都应该动态发生,因此表调整可能会自动通过缓存机制反映在前端,这样所有的模型自省都不会降低性能。换句话说,当数据库中已经仔细定义了模型定义时,我不想在XML文件中重复模型定义。

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

解决方案

回答

我们应该看看django,尤其是它的newforms和admin模块。 newforms模块为用户自动生成错误消息/页面提供了很好的可能性来进行服务器端验证。也可以添加ajax验证

回答

我相信Django模型不支持复合主键(请参阅文档)。但是也许我们可以在Django中使用SQLAlchemy? Google搜索表明我们可以。我没有使用Django,所以我不知道。

我建议我们看一下:

  • Tosca小部件
  • DBSprockets,包括DBMechanic
  • 猫步。 Catwalk是TurboGears 1.0的应用程序,它使用SQLObject,而不是SQLAlchemy。还可以查看此博客文章和截屏视频。
  • FastData。也使用SQLObject。
  • 形式化学
  • 朗姆酒

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

对于Python的Web应用程序框架,我建议使用TurboGears2. 不是说我对任何其他框架都有任何经验,我只是喜欢TurboGears ...

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

回答

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

回答

我知道我们需要一个框架,但是我想我会让我们知道我在这里所做的事情。我刚刚经历了将公司的Web应用程序从自定义内部ORM层转换为sqlAlchemy的过程,所以我与专家相去甚远,但是发生的事情是sqlAlchemy具有从数据库映射的所有属性的类型,所以为什么不使用它来帮助将正确的html输出到页面上。因此,我们在后端使用sqlAlchemy,在前端使用Cheetah模板,但是介于两者之间的所有内容基本上都是我们自己的。

我们从未设法找到一个可以准确地实现我们想要的功能而又不妥协的框架,而是更喜欢获得对我们有用的所有内容并自行编写粘合剂。

第1步。对于每种数据类型sqlAlchemy.types.INTEGER等,向HTML添加一个额外的函数(或者对HTMLReadOnly,对HTMLAdminEdit进行添加),只需返回HTML模板,现在我们甚至不必关心什么数据如果我们只想吐出整个桌子,则可以键入显示内容(作为猎豹模板或者模板引擎使用的模板)。

第2步

<表>

<tr>

#for $ dbObject.c中的$ field:

<th> $ field.name </ th>

#end为

</ tr>

<tr>

#for dbObject.c中的$ field:

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

#end为

</ tr>

</ table>

使用这种基本方法并扩展python内省的潜力,在一个下午,我设法为整个数据库的admin部分创建了create read update和delete代码,虽然还没有完善的django,但足够满足我的需求。

步骤3发现只需要在星期五进行第三步,便想上传文件,而我们所需要的文件比varchar数据类型的默认文本框还要多。不费吹灰之力,我只是将表定义中的行类从VARCHAR覆盖到FilePath(VARCHAR),其中唯一的区别是FilePath具有不同的toHtml方法。完美地工作。

综上所述,如果有一种收缩膜可以满足需要,请使用该收缩膜。

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

回答

web2py可以满足大部分要求:

根据字段类型及其验证器,它将使用适当的小部件呈现该字段。我们可以使用

db.table.field.widget=...

并使用第三方小部件。

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

IS_EMPTY_OR(...)验证器。

DAL防止SQL注入,因为一切都在进入DB时被转义了。

web2py阻止XSS,因为除非另行指定,否则{{= XML(variable)}}或者{{= XML(variable,sanitize = True)}}中的{{= variable}}中的'variable'被转义。

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

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

T是为了国际化。