浏览 4756 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-03-27
最后修改:2009-03-27
继上次用HTTPServer写了一个简单的HTTPHandler后,我发现如果采用HTTPServer处理WEB请求的话系统没有提供获得请求参数的方法(如Java里的request.getParameter),这哪成,不能获取参数还跟用户交互个屁啊。于是又一头扎进了一望无垠的类库中。下面就是今天早上看来一个多小时的结果。 除上次说用到的那几个之外,这次新加了一个urllib 核心代码: urllib.parse.parse_qs(urllib.parse.unquote(s)) urllib.parse.unquote 将被quote的字符串解码,即常规的url编码解码操作 那么,先上代码吧: #!coding=UTF-8 from http.server import HTTPServer,BaseHTTPRequestHandler import io,shutil,urllib class MyHttpHandler(BaseHTTPRequestHandler): def do_GET(self): name="World" if '?' in self.path:#如果带有参数 self.queryString=urllib.parse.unquote(self.path.split('?',1)[1]) #name=str(bytes(params['name'][0],'GBK'),'utf-8') params=urllib.parse.parse_qs(self.queryString) print(params) name=params["name"][0] if "name" in params else None r_str="Hello "+name+" <form action='' method='POSt'>Name:<input name='name' /><br /><input type='submit' value='submit' /></form>" enc="UTF-8" encoded = ''.join(r_str).encode(enc) f = io.BytesIO() f.write(encoded) f.seek(0) self.send_response(200) self.send_header("Content-type", "text/html; charset=%s" % enc) self.send_header("Content-Length", str(len(encoded))) self.end_headers() shutil.copyfileobj(f,self.wfile) def do_POST(self): s=str(self.rfile.readline(),'UTF-8')#先解码 print(urllib.parse.parse_qs(urllib.parse.unquote(s)))#解释参数 self.send_response(301)#URL跳转 self.send_header("Location", "/?"+s) self.end_headers() httpd=HTTPServer(('',8080),MyHttpHandler) print("Server started on 127.0.0.1,port 8080.....") httpd.serve_forever()
其实这个程序没做什么特殊操作,就是把原来的Hello World改了一下,让客户先输入姓名再显示Hello xxx... 获取参数,最重要的是解码操作,do_GET是最郁闷的,如果客户直接在地址栏输入 xxx/?name=某人 则此时的编码比较麻烦,必须使用 name=str(bytes(params["name"][0],'iso-8859-1'),'GBK'),当然了,这是针对我的IE7是这样,其他浏览器我还没进行测试。 这里使用了params["name"][0],parse_sq将每个参数看做是一个数组,就算你只传了一个过来,也会被认为是数组,与java的request.getParametersMap类似 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |