前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python项目练习六:使用CGI进行远程编辑

python项目练习六:使用CGI进行远程编辑

作者头像
the5fire
发布2019-02-28 15:59:21
6680
发布2019-02-28 15:59:21
举报
文章被收录于专栏:Python程序员杂谈

记得一开始接触web开发的时候,看视频,视频里面的老师一般都会语重心长的说:想当年我们一开始学习编程那会儿,都是用cgi编程,复杂的很,现在你们学习web编程,直接有现成的框架来用,十分简单。记得当然听完这句话之后就会觉得这个老师好有经验,技术很高。

不过后来慢慢的接触web编程时间长了,觉得cgi编程并不是像传说中的那么难,只不过是比较麻烦,在后台使用html硬编码来完成(也就是在后台使用类似print的语句输出html)。通过浏览器直接访问cgi文件,由web服务器执行cgi脚本,输出内容到浏览器。关于cgi的更多内容可以参考这里:http://www.jdon.com/idea/cgi.htm

再来看这个python中的cgi,确实很简单。但是有一点我不确定,就是如果我是初学web编程的话,会不会觉得这个简单,这个角度的思考确实不好操作。

下面直接上代码吧,和书上的不太一样,因为书上的代码在我的电脑上不能正常运行。 首先是index.html:

::

代码语言:javascript
复制
<html>
        <head>
                <title>File Editor</title>
        </head>
        <body>
                <form action='/test/cgi-bin/edit.cgi' method='POST'>
                        <b>File name:</b><br/>
                        <input type='text' name='filename'/>
                        <input type='submit' value='Open'/>
                </form>
        </body>
</html>

edit.cgi,用来接受index页面的名字,然后根据名字查找文件,并且输出。

.. code:: python

代码语言:javascript
复制
print 'Content-type: text/html\n'

from os.path import join, abspath
import cgi,sys

BASE_DIR = abspath('data')

form = cgi.FieldStorage()
filename = form.getvalue('filename')
if not filename:
        print 'Please enter a file name'
        sys.exit()

try:
        text = open(join(BASE_DIR,filename)).read()
except Exception,data:
        print str(data)


print """
<html>
 <head>
  <title>Editing...</title>
 </head>
 <body>
 <form action='/test/cgi-bin/save.cgi' method='POST'>
 <b>File:</b>%s<br/>
 <input type='hidden' value='%s' name='filename'/>
 <b>Password:</b><br/>
 <input name='password' type='password' /><br/>
 <b>Text:</b><br/>
 <textarea name='text' cols='40' rows='20'>%s</textarea><br/>
 <input type='submit' value='Save' />
 </form>
 </body>
 </html>
 """ % (filename, filename, text)

最后一个文件save.cgi:

.. code:: python

代码语言:javascript
复制
#!/usr/bin/env python

print 'Content-type: text/html\n'

from os.path import join, abspath
import cgi, sha, sys

BASE_DIR = abspath('data')

form = cgi.FieldStorage()

text = form.getvalue('text')
filename = form.getvalue('filename')
password = form.getvalue('password')

if not (filename and text and password):
        print 'Invalid parameters'
        sys.exit()

if sha.sha(password).hexdigest() != '8843d7f92416211de9ebb963ff4ce28125932878':
        print 'Invalid password'
        sys.exit()

f = open(join(BASE_DIR,filename), 'w')
f.write(text)
f.close()

print 'The file has been saved.'

代码理解上比较简单,唯一麻烦的地方是web服务器的配置。 我这里使用的是tomcat来做web服务器。需要修改tomcat配置,首先是配置cgi,我引用一段从网上搜来的文字:

要为Tomcat配置CGI服务主要有下面几个步骤:

  1. 把servlets-cgi.renametojar (在%CATALINA_HOME%/server/lib/目录下)改名为servlets-cgi.jar。
  2. 在Tomcat的%CATALINA_BASE%/conf/web.xml 文件中,把关于 CGI的那段的注释去掉。内容样式如下:

::

代码语言:javascript
复制
<servlet>
     <servlet-name>cgi</servlet-name>
     <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
     <init-param>
       <param-name>debug</param-name>
       <param-value>0</param-value>
     </init-param>
     <init-param>
       <param-name>cgiPathPrefix</param-name>
       <param-value>WEB-INF/cgi</param-value>
    </init-param>
     <init-param>
       <param-name>executable</param-name>
       <param-value>/usr/bin/python</param-value>    #the5fire注释,这里要改成自己的python执行路径。
     </init-param>
     <load-on-startup>5</load-on-startup>
</servlet>

其中参数executable需要自已添加进去,它的值就是我们用来解释CGI脚本的程序。一般情况下这里会配置为Perl。"C:/Perl/bin/"为Perl的安装目录。

  1. 在Tomcat的%CATALINA_BASE%/conf/web.xml文件中,把关于对CGI进行映射的那段的注释去掉。内容样式如下:

::

代码语言:javascript
复制
<servlet-mapping>
    <servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>

其中url-pattern就是将来我们访问CGI脚本的url地址模式。

完成上面三个步骤后,我们的Tomcat服务器就具有了运行CGI脚本的能力了。

摘自:http://www.blogjava.net/Tauruser/archive/2007/09/06/143097.html

使用hello.cgi测试一下:

.. code:: python

代码语言:javascript
复制
print 'Content-type:text/plain'
print
print 'Hello World!

然后测试能运行的话,就要把代码放到tomcat的webapp下的某一个app下的WEB-INF中的cgi下。,比如我这里的cgi文件是在tomcat/webapps/test/WEB-INF/cgi/下。另外在cgi目录下要建立一个data文件夹,里面放一个test.txt文件。

最后执行效果如图:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-12-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档