将CGI迁移到框架的最佳方法是什么?

时间:2020-03-06 14:52:02  来源:igfitidea点击:

我有一个在Perl CGI中运行的大型Web应用程序。它运行正常,编写得很好,但是像过去一样,所有html都在CGI调用中进行了硬编码定义,因此,我们可以想象,很难进行维护,改进等。所以现在我想开始添加一些模板并与框架(catalyst或者CGI :: application)集成。我的问题是:这里有人有这样的经历吗?有什么我必须注意的事情吗?我知道,使用这两个框架,我都可以运行本机CGI脚本,这很好,因为我可以一起运行这两个(CGI本机广告"框架化"代码),而不会造成任何创伤。有小费吗?

解决方案

从CGI脚本中的处理逻辑中提取HTML。识别所有会影响HTML输出的代码,因为它们是成为模板变量的候选对象。将其分成一个HTML文件,其中已标识的部分用模板变量标记。最终,我们将能够重构页面,以便所有处理都在代码的开头完成,而HTML模板在所有处理的结尾刚刚调用。

首先编写测试(例如,使用Test :: WWW :: Mechanize)。然后,当我们更改某些内容时,我们始终会知道某件事是否破裂,以及那是什么破裂。

然后将HTML提取到模板中,并将常用的subs提取到模块中。之后,切换到框架是轻而易举的事。

通常,请逐步进行操作,以便我们始终拥有有效的应用程序。

在这种情况下,基本上是从头开始重写,旧代码对于A)测试和B)设计细节很有用。理想情况下,我们将针对要复制的所有基本功能进行一组测试,或者至少对可解析最终结果页面的测试进行测试,以便可以看到新代码为相同的输入返回相同的信息。

代码中的设计细节可能没有用,具体取决于框架自动处理的数量。如果我们有一套不错的测试,并且可以进行简单的转换就可以了,那么就完成了。如果新行为与旧行为不符,则可能需要更深入地研究"为什么?"乍一看,这可能看起来有些古怪,没有任何意义。

首先要记住要做的一件事是,找出是否有人在我们使用的框架中做出了类似的事情。我们可以节省很多时间和金钱。

这是我使用Python而不是Perl做到的,但这没关系:

  • 将HTML和代码分离成不同的文件。我为此使用了模板引擎。
  • 从代码创建函数,这些代码呈现了带有一组参数的模板。
  • 以明智的方式组织功能(我称其为View,受Django启发)。 (管理员视图,用户视图等)。所有视图都遵循相同的调用约定!
  • 重构数据库并请求内容,以便视图仅包含视图特定的代码(请阅读:处理GET,POST请求等,但不包含任何底层信息!)。为此,严重依赖现有的库。

我现在在这里。 :-)当然,下一个明显的步骤是:

  • 编写一个将URL映射到视图的调度程序。当然,这也将导致更好的URL和更好的404-以及错误处理。

框架所做的假设之一是url映射到代码。例如,在框架中,我们经常会看到以下内容:

http://app.com/docs/list
http://app.com/docs/view/123

通常,尽管旧的CGI脚本不能那样工作,但我们更有可能遇到以下情况:

http://app.com/docs.cgi?action=view&id=123

要利用该框架,我们可能需要更改所有URL。是否可以执行此操作以及如何保持旧链接正常工作,很可能构成我们决定的很大一部分。

框架还提供对某种ORM(对象关系映射器)的支持,该ORM抽象化数据库调用并使我们仅处理对象。对于Catalyst,通常是DBIx :: Class。我们应该评估切换到此的成本。

我们可能会发现我们希望使用旧代码作为参考平台进行完整的重写。这可能比我们预期的要少得多的工作。但是,从一些玩具网站开始,以了解我们决定使用的任何框架/标准/模板。