2011年12月15日 星期四

python http web server

http_s1.py
 1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #encoding=utf-8
4 # python 2
5
6 import sys
7 import BaseHTTPServer
8 from SimpleHTTPServer import SimpleHTTPRequestHandler
9 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
10 import string,cgi,time
11
12 class MyHandler(BaseHTTPRequestHandler):
13 def do_GET(self):
14
try:
15 #if self.pathc.endswith(".html")
16 self.send_response(200)
17 #self.send_header('Content-type', 'text/plain')
18 #self.send_header('Content-type', 'text/html; charset=utf-8')
19 self.send_header('Content-type', 'text/xml; charset=utf-8')
20 f = open('/test.html')
21 self.end_headers()
22 self.wfile.write(f.read())
23 f.close()
24 return
25 except IOError:
26 self.send_error(404, 'File Not Found')
27 def do_POST(self):
28
# global rootnode
29 try:
30 ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
31 if ctype == 'multipart/form-data':
32 query=cgi.parse_multipart(self.rfile, pdict)
33 self.send_reponse(301)
34 self.end_headers()
35 upfilecontent = query.get('upfile')
36 print "filecontent", upfilecontent[0]
37 self.wfile.write("<HTML>POST OK.<BR><BR>")
38 self.wfile.write(upfilecontent[0]);
39 except:
40 pass
41
42 HandlerClass = SimpleHTTPRequestHandler
43 ServerClass = BaseHTTPServer.HTTPServer
44 Protocol = "HTTP/1.1"
45
46 if sys.argv[1:]:
47 port = int(sys.argv[1])
48 else:
49 port = 8000
50 server_address = ('127.0.0.1', port)
51
52 HandlerClass.protocol_version = Protocol
53 #httpd = ServerClass(server_address, HandlerClass)
54 #httpd = ServerClass(server_address, MyHandler)
55 httpd = HTTPServer(server_address, MyHandler)
56
57 sa = httpd.socket.getsockname()
58 print "Serving HTTP on", sa[0], "port", sa[1], "..."
59 httpd.serve_forever()


ref: http://fragments.turtlemeat.com/pythonwebserver.php

對於 script language 我似乎搞錯了, 我還停留在 dos 的批次檔和 bash 的能力。只能處理簡單的文字處理功能, 近來接觸 python 後, 原來 script language 可以完成強大的程式, 而且比起 C/C++ 來說, 簡單不少。身為 C/C++、組合語言基本教義派的我, 也不禁開始懷疑幹嘛那麼辛苦用 C/C++ 來打造程式。除了說服自己在速度上的差異, 好像沒什麼可以在說服自己使用 C/C++, 不過速度在自己身邊的應用, 好像也沒有到無法接受的地步。除了練習的 OS 程式外, 用 script language 好像都可以完成。

當然 script language 也有些問題, 例如版本的取捨, 目前為止 python 已經來到第三版, 但還是有很多使用者停留在 2, 就算我才剛學, 也是以 python 2 為主。而 python 2.6 和 2.7 的差異, 也多少困擾開發者, 尤其是在使用標準程式庫之外的 library, 還要確認這個 library 是在那個 python 上才能執行。ex: a lib 要 python 2.7, b lib 只能在 python 2.5 以下執行。以 C++ 來舉個反例: qt3, qt4 在一般的 c++ compiler 都應該可以 compile。

簡單有個很重要的好處, 以 http web server 來說, 很快可以實作一個出來, 把重點擺在 http 來回的 protocol 上, 不用管程式本身的細節, 練功嘛!能動就好了, 不用考慮太多細節, 可以著重在 http 這個重點。

看看 qt 的 web server 版本: http://doc.qt.nokia.com/solutions/4/qtservice/qtservice-example-server.html 雖然簡化不少, 但還是複雜多了。而且只看程式碼本身, python 很容易就可以猜出來每一行在幹嘛, 不用太多的說明。

總之在 c/c++ 之外, 學個 script language 好像還不賴。

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。