继上次用HTTPServer写了一个简单的HTTPHandler后,我发现如果采用HTTPServer处理WEB请求的话系统没有提供获得请求参数的方法(如Java里的request.getParameter),这哪成,不能获取参数还跟用户交互个屁啊。于是又一头扎进了一望无垠的类库中。下面就是今天早上看来一个多小时的结果。
除上次说用到的那几个之外,这次新加了一个urllib
核心代码:
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通用的
那么,先上代码吧:
#!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类似
分享到:
- 2009-03-27 14:21
- 浏览 6426
- 评论(0)
- 论坛回复 / 浏览 (0 / 4723)
- 查看更多
相关推荐
python3.0纯pdf版,适合0基础入门学习python,建议初学者从python3.0上手,会持续更新成一个完整的教程
python3.0廖雪峰python3.0廖雪峰python3.0廖雪峰python3.0廖雪峰python3.0廖雪峰
《机器学习实战》源代码中使用的python2.7 在python3.0中部分是无法使用的,所以这经过了我的调试修改后在python3.0中是可以完美运行的决策树代码 内含数据样本,便于学习
python 3.0 eclipse plugin
python库。 资源全名:NURBS_Python-3.0.00-py2-none-any.whl
python库。 资源全名:gm-3.0.0.14-py3-none-win32.whl
这是python 3.0的官方指导手册。
python3.0 猜数字小游戏,用python3.0 实现一个猜数字小游戏
python3.0 Windows 平台。希望对大家有用
python库,解压后可用。 资源全名:tencentcloud_sdk_python-3.0.300-py2.py3-none-any.whl
python3.0纯pdf版,适合0基础入门学习python,建议初学者从python3.0上手,会持续更新成一个完整的教程
python3.0更新的参考文档,锻炼你的英语水平。绝对的实用,只要你略有English。。。
Python3.0学习笔记, 安装完Python之后(我本机的版本是2.5.4),打开IDLE(Python GUI) , 该程序是Python语言解释器,你写的语句能够立即运行.我们写下一句著名的程序语句。
python基础教程纯pdf版,适合0基础人员学习,对于需要入门python的建议直接上手python3.0,会持续更新成一个整体性的文档
python3.0爬虫抓取北京天气json
Python3.0 Tutorial 简体中文版 发布! 译者:刘鑫 尹伟铭 Kernel1983 HTML制作:刘鑫
文档内容是 www.runoob.com 官网的离线html文件,便于离线学习菜鸟教程,一共有42和html对应42个学习模块
python3.0编程语言,很好用。。。。。。。。。。