【问题标题】:A python web application framework for tight DB/GUI coupling?用于紧密 DB/GUI 耦合的 Python Web 应用程序框架?
【发布时间】:2010-09-07 18:53:05
【问题描述】:

我坚信后端和前端之间紧密耦合的异端思想:我希望在生成用户界面时自动使用有关后端的现有隐含知识。例如,如果 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 应用程序框架中的哪一个将是最少的?

【问题讨论】:

    标签: python sql metadata coupling data-driven


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      我建议你看看:

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

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

      如果原问题的作者找到了一个很好的解决方案,请更新或回答这个帖子。

      【讨论】:

        【解决方案3】:

        我知道你具体要求一个框架,但我想我会让你知道我在这里做什么。我刚刚将我公司的 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 方法。完美运行。

        说了这么多,如果有一个收缩包装的,可以做你想要的,使用它。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • Django 是否可以很好地与 SQLAlchemy 配合使用?上次我听说,Django+SA 分支已垂死,最初的问题将 SA 指定为选择的 ORM。
            猜你喜欢
            • 2019-06-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-08
            • 1970-01-01
            • 2011-05-24
            • 2010-10-31
            相关资源
            最近更新 更多