标签:
我以前web开发基本都是基于java平台的,比如tomcat,servlet等等,由tomcat接收http请求,然后交给servlet处理,servlet处理完成以后把返回结果交给tomcat,由tomcat返回给客户端,这次学习python CGI的时候首先想到的是CGI的圆形原理是什么,怎么处理一次完整的http请求?过程如下:
和我们熟悉的servlet处理相比是相当类似的,但是还有两个问题没有解决:
在此不进行复杂的比较,在此列中我只需要知道:
# apache2.conf配置 # 加载处理python cgi的模块,必须有 LoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so # 一定要注意配置的服务器根目录是是什么,我的是/var/www
# 告诉apache2访问/cgi-bin/的时候去 /var/www/cgi-bin/找脚本,注意要有‘/‘ ScriptAlias /cgi-bin/ /var/www/cgi-bin/ # 对python脚本所在目录进行配置 <Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all AddHandler cgi-script cgi </Directory> # 识别cgi脚本后缀 AddHandler cgi-script .cgi .py
好的姿势都摆好了,可以写一个示例试试配置是否成功。
在/var/www/cgi-bin/目录下新建一个test.py
#!/usr/bin/env python # -*- coding=utf-8 -*- import cgi import cgitb; cgitb.enable() print "Content-type:text/html" print # 注意此处必须加print打印出一个空行,否则CGI无法解析 print """<HTML> <HEAD> <TITLE>CGI Environment</TITLE> </HEAD> <BODY>""" cgi.print_environ() print "</BODY></HTML>"
# 特别注意我使用root用户直接登陆的,此处为了简单起见使用了777,在实际配置重中这是非常不安全的 chmod 777 test.py
# 有些可能是httpd
service apache2 start
在浏览器中输入:localhost/cgi-bin/test.py
看到下面内容(只要有内容就行,具体内容不一定一样)说明配置成功了
Shell Environment: CONTEXT_DOCUMENT_ROOT /var/www/cgi-bin/ CONTEXT_PREFIX /cgi-bin/ DOCUMENT_ROOT /var/www/html ....(此处为省略的内容) ::1 SERVER_ADMIN webmaster@localhost SERVER_NAME localhost SERVER_PORT 80 SERVER_PROTOCOL HTTP/1.1 SERVER_SIGNATURE <address>Apache/2.4.10 (Debian) Server at localhost Port 80</address> SERVER_SOFTWARE Apache/2.4.10 (Debian)
以上是python web学习之前的一些环境搭建工作,以下是一个简单的pyhton CGI程序,完成一个在线编辑器的功能,可以打开文件,编辑文件,保存文件(需要输入密码)。
整个功能比较简单,不再对详细过程解释,代码如下:
<html> <head> <title>editor</title> </head> <body> <form action=‘edit2.py‘ method=‘POST‘> <b>file name</b> <input type=‘text‘ name=‘filename‘ /> <input type=‘submit‘ value=‘open‘ /> </body> </html>
#!/usr/bin/env python #-*- coding=utf-8 -*- import cgi import sys from os.path import join, abspath # 先 输出头信息,便于后面的信息能正常输出 print """Content-type: text/html""" # 文件所在目录 BASE_DIR = abspath(‘data‘) form = cgi.FieldStorage() filename = form.getvalue(‘filename‘) if not filename: print ‘please input a filename‘ sys.exit() text = open(join(BASE_DIR, filename)).read() print """ <html> <head> <title>editing</title> </head> <body> <form action=‘save.py‘ method=‘POST‘> <b>File: %s</b> </br> <input type=‘hidden‘ value=‘%s‘ name=‘filename‘ /> <b> Password :</b><br /> <input type=‘password‘ name=‘password‘ /><br /> <b>Text: </b> <br /> <textarea column=‘20‘ row=‘10‘ name=‘text‘>%s</textarea> </br> <input type=‘submit‘ value=‘save‘ /> </form> </body> </html> """ % (filename, filename, text)
#!/usr/bin/env python #-*- coding=utf-8 -*- import cgi import sys from os.path import join, abspath # 先输出头信息,便于后面的输出正常 print "Content-type: text/html\n" # 文件所在目录 BASE_DIR = abspath(‘data‘) form = cgi.FieldStorage() text = form.getvalue(‘text‘) filename = form.getvalue(‘filename‘) password = form.getvalue(‘password‘) # 检查参数是否为空 if not (text and filename and password): print ‘invalid params‘ sys.exit() # 验正密码 if password != ‘123‘: print ‘invalid params‘ sys.exit() f = open(join(BASE_DIR, filename), ‘w‘) f.write(text) f.close() print ‘the file have been saved‘
注意:
代码位置
http://pan.baidu.com/s/1bo5z4pL
标签:
原文地址:http://www.cnblogs.com/sunshine-2015/p/5494932.html