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

jes*_*ica 1 html perl cgi

我是Perl CGI编程的新手,并且有一些问题.目前我有1个HTML页面和一堆perl页面.用户从HTML页面开始输入他们的姓名和地址.然后,此表单调用Perl CGI文件.现在,当这个Perl文件执行时,它会生成一些用户将看到另一个页面的HTML.现在在perl文件生成的HTML中,还有另一个调用另一个CGI脚本的表单.这继续,所以我基本上每个页面都有一个Perl CGI文件.

这是用CGI做事的正确方法吗?

我遇到的问题是我不知道如何分享所有这些perl文件的信息,因为它们只是通过表单的动作相互通信.

我有一个小购物车,因此需要能够从多个页面初始化,获取和设置它的内容.

如上所述,我如何在文件之间共享数据?

DVK*_*DVK 7

要重新思考Sinan所说的内容,购物车需要使用会话来完成.

我将尝试更多地解释它是如何工作的,因为你的问题似乎意味着你想了解细节.


涉及两个概念:会话Cookie和服务器端的会话数据库.

您的Web服务器有一个内部"会话"数据库 - 它基本上是一个称为"会话密钥"的长字符串和一组数据之间的映射.此数据库可以内置到Web服务器中,或者在Perl CGI的情况下,可以由特殊的Perl模块实现.

什么存储在Session数据库中的这一团数据中?您的CGI脚本决定存储的任何内容 - 在您的情况下,是购物车的当前状态.

如何在页面之间共享信息?会话模块生成一个特殊的" 会话Cookie ",其中cookie的值与用于在会话数据库中的服务器上存储数据blob的"会话密钥"相同.然后由用户的浏览器存储,就像所有其他cookie一样,除了它的值仅在"会话期间"有效 - 它会在短时间后过期或者您关闭浏览器.然后,当用户继续使用Web应用程序时,cookie值将被发送回服务器,因此您的CGI脚本知道重新使用该会话密钥.

注意:另一种方法(而不是使用cookie)是在所有请求之间传递会话ID值(例如,将其编码到所有GET URL和POST表单中).


就Perl CGI实现而言,它取决于您使用的特定Perl Web框架 - 基本会话工作可以使用CGI::SessionCPAN模块完成(还有一个很好的教程).使用Apache Web服务器的人的另一个常用选项是Apache::Session.

一般会话相关模块的功能是为您提供以下API:

  • 管理会话数据库
  • 使用会话密钥(也称为会话ID)在会话数据库中存储/检索数据
  • 获取用户的当前会话ID(来自会话cookie值),如果有的话
  • 如果需要,为用户生成新的会话ID
  • 将会话ID值作为cookie发送,以存储在对用户浏览器的HTTP响应中.

任何体面的Perl Web框架都内置了会话功能(它们仍然使用某种Session管理Perl模块实现,但该框架提供了易于使用的API.

作为"易于使用"的一个例子,在Embperl中,为了在会话中存储一个值,你要做的就是$udat{shopping_cart} = \%shopping_cart_data检索它%shopping_cart_data = %$udat{shopping_cart}- %udat作为一个特殊的哈希名称).而已.框架隐藏的所有细节.


更新:

这与我所看到的实际问题几乎没有任何关系,但是对于这个答案的评论让我想到了它是一个有效的观点.

为了提高代码的整体质量,您应该总是抽象出一般的业务逻辑.在这种情况下,如果您有任何通用逻辑来处理在不同的Perl CGI脚本之间共享的购物车数据,那么该逻辑应该被抽象到一个单独的Perl模块中.

此外,作为进一步的改进:

  • 您应该考虑任何复杂的Web应用程序的MVC(模型 - 视图 - 控制器)设计.为了使这更容易,选择一个符合MVC标准的Perl Web框架(我认为Catalyst现在被认为是主要选项,但在设置之前进行自己的研究.

  • 您还应该有一个允许您模块化和重复使用Web(视图)元素的设计 - 例如,可能会显示购物车中的项目的应用程序的顶部变量将始终是几乎相同的HTML,并且您不应该跨不同的视图复制HTML.(如果您不确定我在说什么,请查看亚马逊网页上的前2行).有不同的技术可以实现这一点,这远远超出了你的问题的范围(框架,带有合并视图的Web框架,用于View打印的Perl模块等等).


Sin*_*nür 5

简短的回答是:你做错了.

您需要使用服务器端会话为服务器端的每个访客存储购物车的内容.

例如,请参阅Justin Simoni 使用CGI :: Application和Template :: Toolkit构建在线购物车My Experiences.

如果您尝试将购物车的内容存储在您提供的HTML页面中,恶意访问者可以轻松更改价格,并为人们在90年代中期发现的折扣提供很好的折扣.