整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Ruby 中的视图模版引擎:简化开发

Ruby 中的视图模版引擎:简化开发

图模版引擎是 Ruby 框架中的重要组成部分。它们用于将数据转换为 HTML 页面。通过使用视图模版引擎,您可以将代码分解成可重用的部分,从而简化开发过程。

常见的视图模版引擎

* ERB:Rails 框架中的内建引擎。

* Liquid:用于 Ruby 和 Rails 的模板引擎。

* Tilt:用于 Rack 和 Ruby 的模板引擎。

视图模版引擎的工作原理

视图模版引擎将模板文件和数据进行解析,并生成 HTML 页面。模板文件包含变量、条件和循环,用于在页面中嵌入数据。

使用视图模版引擎的优点

* 可重用:模板可以被多个控制器和动作重复使用。

* 可读性:模板语言易于理解和使用。

* 可维护:模板可以轻松地更新以更改页面外观。

如何使用视图模版引擎

* 选择一个视图模版引擎。

* 创建一个模板文件。

* 在控制器中加载模板并传递数据。

* 将生成的 HTML 页面返回给客户端。

常见的问题

* 模板错误:检查模板文件的语法和逻辑。

* 数据绑定错误:确保数据与模板中使用的变量匹配。

* 性能问题:检查模板文件的复杂程度。

结论

视图模版引擎是 Ruby 开发的宝贵工具,可以简化开发过程。通过使用视图模版引擎,您可以重用代码、提高可读性并轻松更新页面外观。

建议

* 选择适合项目需求的模板引擎。

* 组织模板文件以提高可维护性。

* 定期检查和更新您的模板引擎以确保最佳性能。

件项目实训及课程设计指导——如何应用CSS+Div分离Web表示层数据处理和展现逻辑

1、常规的Web页面实现方法

早期的Web应用系统开发中的Web页面内的信息定位和Web页面布局一般是采用HTML表格<table>标签实现的,但由于HTML标签本身是将数据和显示风格混合在一起的——请见下面的表格标签示例:

<table><tr><td>表格中的某个单元格需要显示的数据</td></tr></table>

当每个用户请求访问后台服务器时,服务器端程序都必须要将整个页面文件的全部显示格式控制的HTML标签内容向客户端的Web浏览器发出。如下示图为传统的页面设计中利用表格定位和布局页面内容的设计效果的示例图

这种利用<table>标签实现Web页面信息定位和布局的页面设计方法不便于Web页面的维护修改和功能扩展,基于MVC的系统架构模式的基本思想要求将页面中的数据和显示风格两者相互分离——也就是MVC体系架构设计模式中所倡导的表示和模型相互分离的设计原则。

2、J2EE Web 表示层组件JSP

JSP(Java Server Pages)是由Sun Microsystem公司(现在改为Oracle公司)于1999年6月推出的动态网站实现技术,并且是基于Java Servlet以及整个Java技术体系的Web开发技术。

而且JSP技术具有简便和高性能、服务器无关性和可重用性等技术实现方面的特点。但JSP技术在应用方面也暴露出一些不足之处:Web页面开发实现的人员职责不清晰、HTML标签与JSP脚本程序混合在一起而导致Web页面不便于维护升级和功能扩展,因为Web页面的内容("数据")和表现("HTML标签")耦合在一起。

如下示图为某个JSP页面示例,在该JSP页面中包含有服务器端的Java程序脚本代码、JSP标签和HTML标签,整个JSP页面内容显得比较"凌乱",可读性比较低。

正是由于JSP技术本身存在有这些方面的问题,能否将面向对象Java编程技术中所倡导的"封装"、"隔离"等OOP设计思想应用于JSP Web页面的应用开发中?目前在J2EE应用开发平台中出现了许多完善、甚至代替JSP作为表示层的新技术。

3、采用"CSS+Div"分离J2EE Web表示层组件中的数据和表现

(1)"CSS+Div"中的CSS是页面层叠样式表技术

CSS(Cascading Style Sheet)是Web页面层叠样式表技术,利用CSS中的各种规则定义可以统一规范Web应用系统中的整体网页的格式,而不再需要分别给每个Web页面中的目标标签单独进行显示风格的属性设置。从而大大地减少了对Web页面显示风格的重复编辑、也提高了Web页面功能的可扩展性

(2)"CSS+Div"中的Div代表<div>标签

Div其实也就是HTML超文本标签语言中的<div>标签,<div>标签主要用于构建Web页面中区域的定义——简单地说,也就是它能够将Web页面划分为不同的功能区块。每个功能区块的显示风格和其中的数据本身是相互分离的。

(3)采用"CSS+Div"分离Web表示层页面中的数据处理逻辑和表现逻辑

由于CSS主要是实现Web页面中的数据显示风格,而利用<div>标签可以包装和定位其中的数据。因此,"CSS+Div"相互组合在一起就能够分离Web表示层页面文件中的数据处理逻辑和表现逻辑。

Web应用系统的表示层开发人员首先应用<div>标签构建好每个功能区块,之后再用CSS样式单给各个<div>标签统一配置相应的显示风格——<div>标签不仅能够定位页面中的文字内容,也能够包装图片(图片以背景的形式出现)或者其它形式的标签。

<div>标签代表要显示的Web页面数据的一个容器,而CSS层叠样式表技术则能够控制这个容器的各种显示元素——比如高度和宽度、边框的颜色、背景颜色以及其中的文字大小、文字颜色等等这些显示信息。

"CSS+Div"是目前比较流行的Web页面版面布局方式,能够分离Web表示层页面中的数据处理逻辑和表现逻辑、并且还能够减少Web页面中HTML标签的数量、减少网络数据的传送量;也更便于Web页面的维护修改和功能扩展;而且还可以为同一个Web页面或者一组Web页面统一定义一个CSS层叠样式表文件或者为不同的功能区块定义不同的CSS层叠样式表文件,并且可以动态切换和应用不同的CSS层叠样式表文件而产生出Web页面"换皮肤"的应用效果。

4、为什么要应用"CSS+Div"构建Web应用系统表示层组件

(1)减少Web页面中的重复HTML标签和提高Web页面的响应性能

由于采用CSS层叠样式表技术能够全局定义各个不同Web页面的显示风格,从而避免了在每个Web页面中都内嵌有这些显示风格的控制标签,这样的Web页面设计方法能够大大地减少Web页面中的重复标签的数量和提高Web页面的响应性能。

另外,CSS层叠样式表技术的兼容性也比较高——目前各个不同厂商的浏览器也都支持CSS层叠样式表技术。一个采用"CSS+Div"技术实现的Web页面布局可以在不同的Web浏览器、不同的网络设备上都能够正常地显示。因此,它也方便了基于"CSS+Div"构建的Web应用系统的可扩展性和可移植性——Web页面中需要显示的数据及其它形式的内容与显示设备无关。

(2)分离Web页面的表现逻辑与数据结构定义

在实际企业应用系统的Web页面开发中,一般再配合采用JavaScript脚本语言进行行为控制——也就是采用"CSS+Div+JavaScript"三种技术相互结合进行Web页面开发,其中的CSS层叠样式表技术实现Web页面风格的显示、Div(<div>标签)则实现其中数据的包装和定位、而JavaScript脚本程序代码则实现与用户相互交互的事件等行为的控制。

因此,采用"CSS+Div+JavaScript"三种技术相互配合进行Web页面开发,基本上能够达到模型视图控制器(MVC)体系架构设计模式所倡导的"结构"、"表现"、"行为"三者相互分离的效果。

如果应用该技术,首先,将能够使得Web页面中的各个部分的耦合性更小、更易于维护和扩展。比如,如果希望调整Web页面的显示风格,设计和开发实现人员只需要改变相关的CSS层叠样式表文件中有关的样式表定义,而Web页面文件本身并不需要被动地修改;其次,Web页面的结构清晰,设计和开发实现相关的人员分工也非常明确。

5、在银行账户信息管理系统页面开发中应用CSS+Div+JavaScript技术

在示例项目银行账户信息管理系统Web页面开发中,作者应用了"CSS+Div+JavaScript"三种技术,不仅减少了每个Web页面中的标签总量,也将Web页面中的格式、内容和行为三者相互分离。

另外,在银行账户信息管理系统中还应用了Tiles模板技术将整个Web页面分为不同的版块(Tiles),而每个版块中的Web页面文件又采用"CSS+Div+JavaScript"技术实现,最终使得整个Web应用系统中的每个Web页面内的HTML标签数量都比较少,而且可重用度也都比较高。

下面的代码示例中的Web页面内容为示例项目银行账户信息管理系统中版权信息页面内容的示例,其中的JavaScript脚本程序实现Web页面内容的防拷贝控制、而Web页面的显示风格定义由style.css样式表文件定义——请见黑体标识的部分代码——应用CSS+Div+JavaScript技术实现版权信息页面内容的示例

<%@ page contentType="text/html; charset=gb2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
          <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
          <link href='<c:url value="/css/style.css" />' type=text/css rel=stylesheet />
          <title>蓝梦网上银行系统版权信息显示页</title>
    </head>
    <body>
          <script type="text/javascript">
                document.body.oncopy=function (){
                setTimeout( function () {
                var text=clipboardData.getData("text");
                if (text) {
                text=text + "\r\n所复制的内容来源于"蓝梦网上银行系统"
                www.webbank.com ,原文的链接为:"+location.href;
                clipboardData.setData("text", text);
                }}, 100 )
                }
          </script>
          <div id="globalMenuBar">
                <a href='<c:url value="/pageForwordAction.action?action=forwardIndex" />'
                class="hrefstyle">返回首页</a> -
                <a href="#" class="hrefstyle">关于本站</a> -
                <a href="#" class="hrefstyle">网站帮助</a> -
                <a href="#" class="hrefstyle">网站声明</a> -
                <a href="#" class="hrefstyle">服务网点</a> -
                <a href="#" class="hrefstyle">服务热线</a> -
                <a href="#" class="hrefstyle">广告合作</a> -
                <a href="#" class="hrefstyle">下载声明</a> -
                <a href="#" class="hrefstyle">友情连接</a> -
                <a href="#" class="hrefstyle">网站地图</a> -
                <a href="#" class="hrefstyle">联系我们</a>
          </div>
    </body>
</html>

为了减少本书的篇幅,在上面的代码示例中省略了各个超链接中的目标URL地址的显示。该页面在Macromedia Dreamweaver工具软件中的预览效果请见下图示例图所示。

6、应用支持"CSS+Div"的可视化软件工具提高页面开发的效率

(1)CSS Tab Designer是一款使用CSS设计导航菜单的可视化软件

由于在"CSS Tab Designer"可视化软件中内置有高达60多种不同风格的样式,Web页面开发人员只需修改现成样式的模版文件,就能快速地生成满足自己的Web应用系统需要的CSS菜单。如下示图为"CSS Tab Designer"官方网站对该软件的功能特性的介绍文字的局部截图,读者可以在此网站中下载该软件,为开源共享软件。

并且该软件生成的XHTML标签严格遵循W3C网页标准,所创建出的CSS菜单也能够兼容于各种主流的浏览器(如Internet Explorer、Firefox、Opera、Netscape等)。

读者在成功下载该开源软件后,在CSS Tab Designer的系统文件及目录结构中的tab.exe文件为它的启动程序。而在Help目录中的文件为操作帮助指南,samples目录内的文件为示例样式文件,styles目录内的文件为CSS Tab Designer内带的各个样式模板文件。

(2)启动CSS Tab Designe导航菜单可视化软件

读者点击所下载的CSS Tab Designe文件目录中的tab.exe文件就可以启动CSS Tab Designe导航菜单可视化软件,下图所示为启动后的初始界面的截图。其中在左面【项目】视图中显示所创建的各个页面文件;而在中间的【标签样式表】视图中提供有CSS Tab Designe可视化软件内带的各个模板样式,开发人员可以直接选择;在右面的【预览】视图中直接显示开发人员所设计的结果、并能够采用"所见即所得"方式进行开发实现。

(3)浏览CSS Tab Designe导航菜单可视化软件的操作帮助指南

在CSS Tab Designe导航菜单可视化软件提供有操作帮助指南,并且文档的技术说明内容写的也比较详细和易懂——请见下图所示的帮助文档的局部内容的截图。读者可以浏览和阅读CSS Tab Designe导航菜单可视化软件的帮助文档掌握对该软件的使用,以提高应用CSS+Div技术进行页面设计时的效率。

如何应用策略设计模式的思想设计通用的数据库连接类

如何应用策略设计模式分离JDBC数据库连接中的外部环境信息

如何应用GOF设计模式中的构建者模式创建复合对象实例

如何应用GOF设计模式中的创建型模式实现松耦合地创建对象实例

如何应用观察者设计模式重构系统中日志处理功能实现的程序代码

为开发人员,我们依赖于静态分析工具来检查、lint(分析)和转换我们的代码。我们使用这些工具来帮助我们提高生产效率并生成更好的代码。然而,当我们使用markdown编写内容时,可用的工具就很少。

在本文中,我们将介绍如何开发一个Markdown扩展来解决在使用Markdown管理Django站点中的内容时遇到的挑战。

你认为他们有linter吗?

照片来自Pexels,由mali maeder拍摄

问题

像每个网站一样,我们在主页、FAQ部分和“关于”页面等地方都有不同类型的(大部分)静态内容。很长一段时间以来,我们都是在Django模板中直接管理这些内容的。

当我们最终决定是时候将这些内容从模板转移到数据库中时,我们认为最好使用Markdown。从Markdown生成HTML更安全,它提供了一定程度的控制和一致性,并且对于非技术用户来说更容易处理。随着我们转移过程的进展,我们注意到我们遗漏了一些东西:

内部链接

当URL更改时,链接到内部页面的链接可能会中断。在Django模板和视图中,我们使用了reverseand {% url %},但是这在普通的Markdown中是不可用的。

在不同环境之间进行复制

绝对内部连接不能在不同环境之间进行复制。这可以使用相对链接来解决,不过目前没有开箱即用的增强这一点的方法。

无效链接

无效链接会损害用户体验,并导致用户质疑整个内容的可靠性。这并不是Markdown独有的东西,只不过HTML模板是由对URL有一定了解的开发人员维护的。另一方面,Markdown文档是为非技术写作人员设计的。

前期工作

当我研究这个问题时,我搜索了Python linters、Markdown预处理器和扩展来帮助生成更好的Markdown。结果都不是很好。一个引人注目的方法是使用Django模板来生成Markdown文档。

使用Django模板预处理Markdown

使用Django模板,你可以使用诸如url之类的模板标记来反向查询URL名称,并配合使用条件、变量、日期格式和所有其他Django模板特性。这种方法本质上是使用Django模板作为Markdown文档的预处理程序。

我个人认为这可能不是非技术作家的最佳解决方案。另外,我担心提供对Django模板标记的访问可能是危险的。

使用 Markdown

对这个问题有了更好的理解之后,我们准备在Python中更深入地研究Markdown。

将Markdown转换为HTML

要在Python中开始使用Markdown,我们先安装markdown包:

接着,创建一个Markdown对象并使用其函数将一些Markdown转换成HTML:

你现在可以在你的模板中使用这个HTML代码片段。

使用Markdown扩展

基本的Markdown处理器提供了生成HTML内容的基本要素。对于更“新奇”的选项,Python markdown包包含了一些内置扩展。一个流行的扩展是“extra”扩展,除了其他东西之外,它增加了对隔离代码块的支持:

为了使用我们独特的Django功能扩展Markdown,我们将开发自己的扩展。

创建一个Markdown扩展来处理内联链接

如果你查看源代码,你将看到要将markdown转换为HTML, Markdown会使用多种不同的处理器。一种类型的处理器是内联处理器。内联处理器会匹配特定的内联模式,如链接、反引号、粗体文本和带下划线的文本,并将它们转换为HTML。

我们的Markdown扩展的主要目的是验证和转换链接。因此,我们最感兴趣的内联处理器是LinkInlineProcessor。这个处理器以[Haki的网站](https://hakibenito.com)的形式获取markdown ,解析它并返回一个包含链接和文本的元组。

为了扩展该功能,我们扩展了LinkInlineProcessor并创建了一个Markdown.Extension, 我们用它来处理链接:

我们来将这段代码分解一下::

  • DjangoUrlExtension扩展注册了一个名为DjangoLinkInlineProcessor的内联链接处理器。这个处理器将取代任何其他现有的链接处理器。

  • 内联处理器DjangoLinkInlineProcessor扩展了内置的LinkInlineProcessor,并在它处理的每个链接上调用clean_link函数。

  • clean_link函数接收一个链接和一个域名,并返回一个转换后的链接。这就是我们要插入我们的实现的地方。

如何获得网站域名


要识别到你自己网站的链接,你必须知道你的网站的域名。如果你正在使用Django的sites框架,那么你可以使用它来获取当前域名。


我没有把它包含在我的实现中,因为我们没有使用sites框架。相反,我们在Django设置中设置了一个变量。


获取当前域名的另一种方法是使用HttpRequest对象。如果内容只在你自己的站点中被编辑,你可以尝试从请求对象中插入站点域名。这可能需要对你的实现进行一些更改。

要使用该扩展,请在初始化一个新的Markdown实例时添加它:

太好了,这个扩展已经被使用了,我们准备进入有趣的部分了!

验证和转换Django链接

既然我们得到了在所有链接上调用clean_link的扩展,那我们可以来实现我们的验证和转换逻辑。

验证mailto链接

要开始工作,我们将从一个简单的验证开始。mailto链接对于使用预定义的收件人地址、主题甚至消息正文打开用户的电子邮件客户端非常有用。

一个常见的mailto链接是这样的:

这个链接将打开你的电子邮件客户端,并设置成撰写一封主题行为“我需要帮助!”的新电子邮件给“support@service.com”。

mailto链接不一定非要包含电子邮件地址。如果你看一看这篇文章底部的“分享”按钮,你会发现像这样的一个mailto链接:

这个mailto链接没有包含收件人,仅包含了主题行和消息正文。

既然我们已经很好地理解了mailto链接是什么样子的,我们就可以向clean_link函数添加第一个验证:

为了验证mailto链接,我们向clean_link中添加了以下代码:

  • 检查链接是否以mailto:开头,以识别相关链接。

  • 使用正则表达式将链接分割到它的组件。

  • 从mailto链接中删除实际的电子邮件地址,并使用Django的EmailValidator验证它。

注意,我们还添加了一种名为InvalidMarkdown的新异常类型。我们定义了自己的自定义异常类型,以将它与markdown本身所引发的其他错误区分开来。

自定义错误类

我曾经写过关于自定义错误类的文章,为什么它们是有用的,以及你什么时候应该使用它们。

在我们继续之前,让我们添加一些测试,看看它的实际效果:

太棒了!按预期的运行了。

处理内部和外部链接

既然我们已经了解了mailto链接,我们也可以处理其他类型的链接:

外部链接

  • 我们的Django应用程序外部的链接。

  • 必须包含一个页面跳转协议(scheme):http或https。

  • 理想情况下,我们还希望确保这些链接没有被破坏,但我们现在不会这样做。

内部链接

  • 到我们的Django应用程序中的页面的链接。

  • 链接必须是相对的:这将允许我们在不同环境之间移动内容。

  • 使用Django的URL名称而不是一个URL路径:这将允许我们安全地来回移动视图,而不必担心markdown内容中的失效链接。

  • 链接可能包含查询参数(?)和片段(#)。

SEO

从SEO的角度来看,公共URL不应该改变。当他们这样做的时候,你应该使用重定向正确地处理它,否则你可能会受到搜索引擎的惩罚。

有了这个需求列表,我们就可以开始工作了。

解析URL名称

要链接到内部页面,我们希望编写者提供一个URL名称,而不是URL路径。例如,假设我们有这个视图:

这个页面的URL路径是https://example.com/, URL名称是home。我们想要在我们的markdown链接中使用这个URL名称home,就像这样:

这将渲染到:

我们还想支持查询参数和散列:

这将渲染到以下HTML:

在使用URL名称时,如果我们更改了URL路径,内容中的链接将不会被破坏。要检查作者提供的href是否是一个有效的url_name,我们可以尝试reverse它:

URL名称“home”指向URL路径“/”。当没有匹配项时,将会引发一个异常:

在我们继续之前,当URL名称包含查询参数或散列时,会发生什么:

这是有意义的,因为查询参数和散列不是URL名称的一部分。

要使用reverse并支持查询参数和散列,我们首先需要清除值。然后,检查它是一个有效的URL名称,并返回包含查询参数和散列的URL路径,如果提供了的话:

这个代码段使用一个正则表达式来以?或#的出现对href进行分割,并返回各部分。

请确保它可以工作:

太了不起了!作者们现在可以在Markdown中使用URL名称了。它们还可以包括要添加到该URL的查询参数和片段。

处理外部链接

要正确处理外部链接,我们需要检查两件事:

1.外部链接总是提供一个跳转协议,http:或者https:。

2.阻止到我们自己网站的绝对链接。内部链接应该使用URL名称。

到目前为止,我们已经处理了URL名称和mailto链接。如果我们通过了这两个检查,这意味着href是一个URL。让我们从检查链接是否是链接到我们自己的网站开始:

函数urlparse会返回一个命名元组,该元组包含URL的不同部分。如果netloc属性等于site_domain,那么该链接就确实是一个内部链接。

如果URL实际上是内部的,我们就需要终止。但是,请记住,作者们不一定是技术人员,因此我们希望帮助他们,并提供一个有用的错误消息。我们要求该内部链接使用URL名称而不是URL路径,所以最好让作者们知道他们提供的路径的URL名称。

要获得一个URL路径的URL名称,Django为我们提供了一个名为resolve的函数:

当找到匹配项时,resolve会返回一个ResolverMatch对象,其中包含URL名称和其他信息。当没有找到匹配项时,它就会引发一个错误:

这实际上就是Django在底层所做的工作,用来确定在一个新请求到来时执行哪个视图函数。

为了给作者们提供更好的错误信息,我们可以使用来自ResolverMatch对象的URL名称:

当我们识别出内部链接时,我们要处理两种情况:

  • 我们没有识别出这个URL:这个URL很可能是不正确的。请作者检查该URL是否有错误。

  • 我们识别出了这个URL: 这个URL是正确的,所以就告诉作者应该使用什么URL名称。

我们来实际地看一下它:

漂亮!外部链接被接受,内部链接被拒绝,并带有一个有用的消息。

要求跳转协议

我们要做的最后一件事是确保外部链接包含一个跳转协议,要么是http:,要么是https:。让我们将这最后一部分添加到函数clean_link:

使用解析后的URL,我们可以很容易地检查跳转协议。让我们确保它正在工作:

我们向这个函数提供了一个没有跳转协议的链接,但是它运行失败了,并显示了一条有用的消息。太酷了!

整合代码

这是clean_link函数的全部代码:

要了解所有这些特性的一个实际用例是什么样子的,请看下面的内容:

这将产生以下HTML:

不错!

结论

我们现在有一个很不错的扩展,它可以验证和转换Markdown文档中的链接!现在,在不同环境之间移动文档和保持内容整洁要容易多了,最重要的是,可以保持正确和最新!

源码

你可以在这个gist中找到全部源代码。(地址:https://gist.github.com/hakib/73fccc340e855bb65f42197e298c0c7d )

题外话

本文中所描述的功能对我们很有用,但是你可能需要根据自己的需求对它进行调整。

如果你需要一些想法,那么除了这个扩展之外,我们还创建了一个markdown Preprocessor,它允许作者们在markdown中使用常量。例如,我们定义了一个名为SUPPORT_EMAIL的常量,我们像这样使用它:

该预处理程序将用我们定义的文本替换字符串$SUPPORT_EMAIL,然后才渲染Markdown。

英文原文:https://hakibenita.com/django-markdown
译者:Nothing