最新消息:

用python做web服务器

Python admin 1浏览

python是一门有趣的语言,当然也可以做一些有趣的东西.

先看看这个最简单的web服务器.

import SimpleHTTPServer<br>SimpleHTTPServer.test()

当然,这个server只能在localhost下面运行.但是却可以提供静态页面显示.

再看一个稍微复杂的.

import SimpleHTTPServer<br>import SocketServer<br>PORT = 8800<br>handler = SimpleHTTPServer.SimpleHTTPRequestHandler<br>httpd = SocketServer.TCPServer(("192.168.1.103",PORT),handler)<br>print'serving at port',PORT<br>httpd.serve_forever()

上例,先创建了个tcp的server,不过,采用simple http request handler作为其handler.这样一来,你可以用网内的机子来访问这个web server了.有一点要注意,就是你的html文件目录和当前的脚本所在目录是一致的.

再往后看:

import SimpleHTTPServer<br>import SocketServer<br>import os<br>PORT = 8800<br>WEBDIR ="/www"<br>class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler):<br>def translate_path(self,path):<br>os.chdir(WEBDIR)<br>return SimpleHTTPServer.SimpleHTTPRequestHandler.translate_path(self,path)<br>try:<br>#handler = SimpleHTTPServer.SimpleHTTPRequestHandler<br>httpd = SocketServer.TCPServer(("192.168.1.103",PORT),Handler)<br>print'dir %s serving at port %s'%(repr(WEBDIR),PORT)<br>httpd.serve_forever()<br>except:<br>pass

这个例子较上例是,可以设定html所在的目录.

如果不想用socketServer,可以直接用BaseHttpServer,他继承自SocketServer.

import BaseHTTPServer<br>import SimpleHTTPServer<br>from SimpleHTTPServer import SimpleHTTPRequestHandler<br>from BaseHTTPServer import HTTPServer<br>def run(server_class = BaseHTTPServer.HTTPServer,<br>handler_class = SimpleHTTPRequestHandler):<br>server_address =('',8000)<br>httpd = server_class(server_address,handler_class)<br>httpd.serve_forever()<br>if__name__=="__main__":<br>run()

在本地做测试的时候,应该是完全没问题的.但是在两台互通的机器上面做的时候,我在做实验的时候却老是不通.想来想去,只能想到是防火墙的原因了.

我的server端采用的是fedora10,测试客户机是vista.用client来ping server的时候是成功的,但是用server来ping client的时候是失败的.将vista的防火墙关掉,ping是成功的.

然后打开fedora的防火墙设置.system=>adminstrator=>firewall.将所要使用的服务改为trust.如果要用不在列表中的端口,在others里面把其它所要用的端口号加进去,然后一切便OK了.

下面的例子是使用simple http server作为一个代理服务器.

import SocketServer<br>import SimpleHTTPServer<br>import urllib<br>PORT = 1234<br>class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):<br>def do_GET(self):<br>self.copyfile(urllib.urlopen(self.path), self.wfile)<br>httpd = SocketServer.ForkingTCPServer(('', PORT), Proxy)<br>print"serving at port", PORT<br>httpd.serve_forever()

有兴趣的朋友可以自行调试.

现在我们再看一下怎么搞cgi server.

基本上代码不变,只不过要将handler改成CGIHTTPRequestHandler.

from CGIHTTPServer import CGIHTTPRequestHandler<br>from BaseHTTPServer import HTTPServer<br>server_addr =('192.168.1.103',8000)<br>httpd = HTTPServer(server_addr,CGIHTTPRequestHandler)<br>httpd.serve_forever()

这样一来,服务器相当于搞定了.当然我们要看一下怎么显示一个动态页面.动态语言依旧用python,在server的同级目录建一个cgi-bin目录,在这个目录里面建立hello.py:

#!/usr/bin/python<br>print"HTTP/1.0 200 OK"<br>print"Content-Type:text/html"<br>print""<br>print""<br>print"Hello,world!"<br>print""

可能你在执行的时候,浏览器里面显示为空,再看在server端的提示:

Traceback (most recent call last):
File “/wp-content/lib/python2.5/CGIHTTPServer.py”, line 251, in run_cgi
os.execve(scriptfile, args, os.environ)
OSError: [Errno 13] Permission denied
应该是权限问题.最简单的方法是将整个cgi-bin目录权限改为最大: chmod -R 777 cgi-bin.再次执行,一切OK!

转载请注明:爱开源 » 用python做web服务器

转载请注明:爱开源 » 用python做web服务器