参考《Python网络编程基础》+ Python docs
SocketServer是基础文件,如下:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
然后BaseHTTPServer之类的继承于TCPServer, SimpleHTTPServer和CGIHTTPServer继承于BaseHTTPServer.
使用时需要定义一个server类,一个handler类,server类用来监听,handler类用来处理request. handler类会自动调用handle()方法。BaseHTTPServer的handler会对每一个http请求(GET/HEAD等)调用对应的do_*方法(do_GET/do_HEAD等), 并可通过自己的属性与client互动,详见BaseHTTPServer。
问题1:
CGI Server:
#!/usr/bin/env python
# Basic HTTP CGI Server Example - Chapter 17 -Chapter17-basichttpcgiserver.py
from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
from CGIHTTPServer import CGIHTTPRequestHandler
from SocketServer import ThreadingMixIn
class ThreadingServer(ThreadingMixIn, HTTPServer):
pass
sock = ('', 8765)
server = ThreadingServer(sock, CGIHTTPRequestHandler)
#server = HTTPServer(sock, SimpleHTTPRequestHandler)
server.serve_forever()
CGI Script:
#!/usr/bin/env python
# Simple CGI Example - Chapter 18 - chapter18_simple.cgi
import cgitb
cgitb.enable()
import time
print 'Content-type:text/html'
print
print '''<HTML>
<HEAD>
<TITLE>Sample CGI Script</TITLE>
</HEAD>
<BODY>
The present time is %s.
</BODY>
</HTML>''' % time.strftime('%I:%M:%S %p %Z')
print
保存目录(Windows10+chrome浏览器)
D:
- - - - Code
- - - - - - - - Chapter17-basichttpcgiserver.py
- - - - - - - - cgi-bin
- - - - - - - - - - - - chapter18_simple.cgi
原文中说把cgi脚本放到web服务器合适的位置,没有具体说那个路径。
启动服务器:
C:\Users\admin>D:\Code\Chapter17-basichttpcgiserver.py
在浏览器输入:http://localhost:8765/cgi-bin/chapter18_simple.cgi , 显示404:No such CGI script
修改服务器执行路径到D:\Code,重新启动服务器,输入浏览器脚本名字,显示403:CGI script is not executable.根据网上查找,把cgi文件的后缀改为.py即可。修改后执行成功,显示时间:The present time is 11:30:25 PM 中国标准时间.