在Python3.0中使用HTTPServer处理web请求2-获取请求参数

转自:http://phyeas.iteye.com/blog/356121


继上次用HTTPServer写了一个简单的HTTPHandler后,我发现如果采用HTTPServer处理WEB请求的话系统没有提供获得请求参数的方法(如Java里的request.getParameter),这哪成,不能获取参数还跟用户交互个屁啊。于是又一头扎进了一望无垠的类库中。下面就是今天早上看来一个多小时的结果。

除上次说用到的那几个之外,这次新加了一个urllib

核心代码:

Python代码   收藏代码
  1. urllib.parse.parse_qs(urllib.parse.unquote(s))  

urllib.parse.unquote  将被quote的字符串解码,即常规的url编码解码操作
urllib.parse.parse_qs 将字符串解释为dict
这里解释下为什么说是字符串转为dict:从客户端过来的参数,无论是GET还是POST过来的,其值都是一个字符串,"a=1&b=2",
如果是POST那么字符串最后还有一个\n或者\r\n,所以这个方法是GET,POST通用的

那么,先上代码吧:

Python代码   收藏代码
  1. #!coding=UTF-8    
  2. from http.server import HTTPServer,BaseHTTPRequestHandler     
  3. import io,shutil,urllib     
  4.     
  5. class MyHttpHandler(BaseHTTPRequestHandler):     
  6.     def do_GET(self):     
  7.         name="World"    
  8.         if '?' in self.path:#如果带有参数     
  9.         self.queryString=urllib.parse.unquote(self.path.split('?',1)[1])     
  10.             #name=str(bytes(params['name'][0],'GBK'),'utf-8')     
  11.             params=urllib.parse.parse_qs(self.queryString)     
  12.             print(params)     
  13.             name=params["name"][0if "name" in params else None     
  14.         r_str="Hello "+name+" <form action='' method='POSt'>Name:<input name='name' /><br /><input type='submit' value='submit' /></form>"    
  15.         enc="UTF-8"    
  16.         encoded = ''.join(r_str).encode(enc)     
  17.         f = io.BytesIO()     
  18.         f.write(encoded)     
  19.         f.seek(0)     
  20.         self.send_response(200)     
  21.         self.send_header("Content-type""text/html; charset=%s" % enc)     
  22.         self.send_header("Content-Length", str(len(encoded)))     
  23.         self.end_headers()     
  24.         shutil.copyfileobj(f,self.wfile)     
  25.     def do_POST(self):     
  26.         s=str(self.rfile.readline(),'UTF-8')#先解码     
  27.         print(urllib.parse.parse_qs(urllib.parse.unquote(s)))#解释参数     
  28.         self.send_response(301)#URL跳转     
  29.         self.send_header("Location""/?"+s)     
  30.         self.end_headers()     
  31.     
  32. httpd=HTTPServer(('',8080),MyHttpHandler)     
  33. print("Server started on 127.0.0.1,port 8080.....")     
  34. 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类似


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值