今天的进度更新到《python标准库》的第十二章 Internet。
初读之下,略感陌生,拿起了之前只读了1/3的《自顶向下方法》复习起来,结合之前的Tcp/Udp的一些小demo之后,感觉理解和思考更进了一个层次,之前很多掠过一眼的东西,现在能引起我的思考。愿一步一个脚印。
今天主要打了HTTP中 GET和POST两大方法的实现。虽然书中给出的报文似乎不是很标准,但是对其实现有了更进一步的思考。
基于BaseHTTPServer
这个库,实现关于自己的GET POST等方法。下面附上代码
from BaseHTTPServer import BaseHTTPRequestHandler
import cgi
class PostHandler(BaseHTTPRequestHandler):
def do_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD':'POST',
'CONTENT_TYPE':self.headers['Content-type']
}
)
self.send_response(200)
self.end_headers()
self.wfile.write('Client:%s\n'%str(self.client_address))
self.wfile.write('User-agent:%s\n'%
str(self.headers['user-agent']))
self.wfile.write('Path:%s\n'%self.path)
self.wfile.write('From data:\n')
for field in form.keys():
field_item = form[field]
if field_item.filename:
file_data = field_item.file.read()
file_len = len(file_data)
del file_data
self.wfile.write(
'\tUpload %s as "%s"(%d bytes)\n'%\
(field , field_item.filename,file_len)
)
else:
self.wfile.write('\t%s=%s\n'%
(field,form[field].value))
return
if __name__ == '__main__':
from BaseHTTPServer import HTTPServer
server = HTTPServer(('localhost',8080),PostHandler)
server.serve_forever()
这是POST方法实现
from BaseHTTPServer import BaseHTTPRequestHandler
import urlparse
class GetHandler(BaseHTTPRequestHandler):
def do_GET(self):
parsed_path = urlparse.urlparse(self.path)
message_parts = [
'CLIENT VALUES:',
'client_address = %s (%s)'%(self.client_address,
self.address_string()),
'command=%s'%self.command,
'path=%s',self.path,
'real path=%s'%parsed_path.path,
'query=%s'%parsed_path.query,
'request_version=%s'%self.request_version,
'',
'SERVER VALUES:',
'server_version=%s'%self.server_version,
'sys_version=%s'%self.sys_version,
'protocol_version=%s'%self.protocol_version,
'',
'HEADERS RECEIVED:'
]
for name,value in sorted(self.headers.items()):
message_parts.append('%s=%s'%(name,value.rstrip()))
message_parts.append('')
message = '\r\n'.join(message_parts)
self.send_response(200)
self.end_headers()
self.wfile.write(message)
return
if __name__ =='__main__':
from BaseHTTPServer import HTTPServer
server = HTTPServer(('localhost',8080),GetHandler)
server.serve_forever()
这是GET方法实现
里面还有一些不懂的地方,明日再战吧。