在web2py中使用HTML帮助程序构建HTML标记有什么好处?

Mer*_*glu 13 markup web2py

我想了解在web2py中使用HTML帮助程序而不是纯HTML标记元素的好处.例如,我在web2py应用程序(reddish)中阅读了以下HTML标记构建器代码:

{{=A(IMG(_src=URL(r=request,c='static',f='up.png')),_href=URL(r=request,f='vote',args=['up',item.id]))}}
Run Code Online (Sandbox Code Playgroud)

通过纯HTML标记编写此代码会导致:

<a href="/reddish/default/vote/up/{{=item.id}}"><img src="/reddish/static/up.png"/></a>
Run Code Online (Sandbox Code Playgroud)

我发现简单的HTML标记更容易阅读.但我想了解使用HTML帮助程序是否有任何好处?

顺便说一下,我第一眼看到的一个好处就是HTML帮助程序代码不需要编写应用程序的名称,即reddish显式.除此之外,使用HTML帮助程序还有其他好处吗?

Ant*_*ony 19

首先,即使在你的第二个例子中,你也应该这样做:

<a href="{{=URL('vote', args=['up', item.id])}}">
<img src="{{=URL('static', 'up.png')}}"/></a>
Run Code Online (Sandbox Code Playgroud)

始终使用URL()帮助程序来编写URL,即使在视图中也是如此.它处理传出的重写,它知道当前的应用程序(和控制器),因此您不必包含那些(这意味着如果您更改其名称,所有URL仍然有效).此外,不再需要指定request或使用cf关键字(reddish是一个旧的应用程序).

关于帮助程序,一般的经验法则是在需要在控制器,模型或模块中创建或操作HTML时使用它们,但在视图中使用常规HTML标记(与Python混合,如第二个示例中所示) .但是,一个例外是当您需要在视图中构建复杂的HTML结构时.在这种情况下,在单个Python代码块中操作帮助程序可能更容易,而不是将常规HTML标记与Python混合.例如,如果您在字典列表中包含数据(使用键'f1','f2','f3')并且想要创建HTML表格,则可以执行以下操作:

{{=TABLE([TR(row['f1'], row['f2'], row['f3']) for row in rows])}}
Run Code Online (Sandbox Code Playgroud)

你可以做同样的事情混合HTML和Python,但它会更长,更麻烦.

帮助程序的另一个主要好处是它们创建了一个可以在Python代码中操作的服务器端DOM.您最有可能在模型/控制器代码中创建的帮助程序是表单(通过FORM,SQLFORM,Crud和Auth系统)和表(通过SQLTABLE,SQLFORM.grid和Crud).这些帮助程序本身包含其他帮助程序,例如表,div和ul,它们可以在被序列化为HTML之前在服务器端进行操作(例如).

此外,一些帮助程序具有添加功能或使其更易于使用的特殊功能:

  • A:同样<a></a>,但也需要特殊的参数来处理Ajax回调.
  • HTML:自动添加doctype字符串.
  • INPUT,OPTION:使用特殊value参数设置当前值,并分别自动处理设置checkedselected属性.
  • OL,UL,SELECT,TR,TBODY:像他们的HTML,除了前者自动转换未命名的参数(或列表/元组的元素)不属于佣到相应的子元素(即<li>,<option>,<td>,和<tr>,分别).(上面的表格示例利用了这一事实 - TR()自动将各个元素转换为单独的元素TD.)

最后,有许多帮助器具有专门的功能:

  • BEAUTIFY:构建复合对象的HTML表示形式.
  • CODE:替代方案可<pre></pre>自动处理多种编程语言的代码突出显示和行编号.
  • MARKMIN:将markmin代码转换为HTML.
  • MENU:从嵌套的元组列表中创建嵌套的ul.
  • TAG:通用标记生成器和HTML解析器.
  • XML:封装不应转义的文本或应清理的文本.

有关详细信息,请参阅帮助程序文档.