html - 在Perl CGI中正确编程/从不同的perl cgi文件访问相同的数据

标签 html perl cgi

我是Perl CGI编程新手,有几个问题。目前我有一个HTML页面和一堆perl页面。用户从一个HTML页面开始,在那里输入他们的姓名和地址。然后,此表单调用Perl CGI文件。现在,当这个Perl文件执行时,它会生成一些HTML,用户将其视为另一个页面。现在在perl文件生成的HTML中,有另一个表单调用另一个CGI脚本。这样继续下去,我基本上每个页面都有一个Perl CGI文件。
这是用CGI做事情的正确方法吗?
我遇到的问题是,我不知道如何共享所有这些perl文件的信息,因为它们只通过表单的操作相互通信。
我有一个小型购物车,因此需要能够初始化,获取和设置它的内容从多个页面。
如何在上述文件之间共享数据?

最佳答案

要重复Sinan所说的话,购物车需要使用会话来完成。
我会尽量多解释一下这一切是如何运作的,因为你的问题似乎意味着你想了解细节。
涉及到两个概念:会话Cookie和服务器端的会话数据库。
您的web服务器有一个内部的“sessions”数据库,它基本上是一个称为“Session Key”的长字符串和一个数据块之间的映射。这个数据库可以构建到web服务器中,或者在Perl-CGI的情况下,可以由一个特殊的Perl模块实现。
会话数据库中的这个数据块中存储了什么?任何你的CGI脚本决定存储的东西-在你的例子中,是购物车的当前状态。
如何在页面之间共享信息?会话模块将生成一个特殊的“Session Cookie”,cookie的值与用于在会话数据库中存储服务器上的blob数据的“会话密钥”相同。然后,它像所有其他cookie一样被用户的浏览器存储,但它的值仅在“会话期间”有效-它在短时间后过期或如果您关闭浏览器。然后,当用户继续使用web应用程序时,cookie值被发送回服务器,因此您的CGI脚本知道如何重用该会话密钥。
注意:另一种方法(而不是使用cookie)是在所有请求之间传递会话ID值(例如,将其编码到所有GET url和POST表单中)。
至于Perl CGI实现,它取决于您使用的特定Perl web框架-基本会话工作可以使用CGI::SessionCPAN模块来完成(这里有一个good tutorial for it as well)。对于使用Apache web服务器的用户来说,另一个常见的选项是Apache::Session
一般会话相关模块所做的是为您提供以下API:
管理会话数据库
使用会话密钥(aka Session ID)在会话数据库中存储/检索数据
从会话cookie值(如果有的话)获取用户的当前会话ID
如果需要,为用户生成新的会话ID
将会话ID值作为cookie发送到用户的浏览器,以存储在HTTP响应中。
任何像样的PerlWeb框架都有内置的会话功能(它们仍然使用某种会话管理Perl模块实现,但是框架提供了易于使用的API。
作为Embperl中“易于使用”的一个例子,要在会话中存储一个值,您所做的就是$udat{shopping_cart} = \%shopping_cart_data并检索它,您所做的%shopping_cart_data = %$udat{shopping_cart}-%udat是一个特殊的散列名称)。就这样。框架隐藏的所有细节。
更新:
在我看来,这与我提出的实际问题几乎没有任何关系,但对这个答案的评论让我想到了这一点。
为了提高代码的整体质量,应该尽可能多地抽象出一般的业务逻辑。在这种情况下,如果您有任何通用逻辑来处理购物车数据,而购物车数据是在不同的Perl CGI脚本之间共享的,那么应该将该逻辑抽象成一个单独的Perl模块。
此外,作为进一步改进:
对于任何复杂的web应用程序,都应该考虑MVC(model-view-controller)设计。为了简化这个过程,选择一个兼容MVC的Perl web框架(我认为Catalyst现在被认为是主要的选择,但是在设置一个框架之前要做自己的研究。
您还应该有一个允许模块化和重用web(视图)元素的设计——例如,可能会在购物车中显示项目的应用程序的顶部变量总是几乎相同的HTML,并且不应该在不同的视图中复制该HTML。(如果你不确定我在说什么,看看亚马逊网页上的前两行)。实现这一点有不同的技术,这些技术远远超出了问题的范围(框架、具有合并视图的web框架、用于视图打印的Perl模块等等)。

关于html - 在Perl CGI中正确编程/从不同的perl cgi文件访问相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964457/

相关文章:

c++ - 如何通过单击 HTML 表单按钮在本地运行程序?

perl - 在 Perl 中使用 CGI.pm 的两种不同编程风格的优缺点是什么?

php - 当我在 Raspberry pi 上单击网站中的链接时如何运行 espeak 命令

javascript - 如何正确地将 django csrf_token 附加到内联 javascript 中?

html - 在 html/JSF 中 - 如何使任何组件响应点击?

javascript - 检查图像是否有灰白色背景

Perl 单行 : deleting a line with pattern matching

perl - 如何用 perl 打开多个事件终端

windows - 在 Windows 上安装 PAR::Packer,dmake 错误 255

html - 如何在 HTML/CSS 中设置百分比高度值