webpy是python基础的web框架,上手简单,基本上有15分钟左右就可以初步了解并写一些简单的demo。但是使用中会发现有一些不够完善的地方。本文作为学习笔记,对其简单介绍。
1.安装
一般安装了pip的话可以直接pip安装
$ sudo pip install web.py
$ sudo pip install flask
ubuntu可以使用apt安装
$ sudo apt install python-webpy
2.简介
## ==========================================================================
## 主函数部分:
## ==========================================================================
if __name__ == "__main__":
## 1.设置 Hander
urls = (
'/cmd/(.*)', 'CmdHander' ##当报文头为http://x.x.x.x:xxx/cmd/*(all)时,调用CmdHander类中的函数
)
app = web.application(urls, globals())
## 2.设置监听
# ========================================================================
# webpy默认使用8080端口,如果需要改端口需要在执行.py文件时加参数
# 例如:python xxxx.py 8888
# 下面的做法,相当于将参数在代码中写入
#=========================================================================
sys.argv.append("8888")
app.run()
## ==========================================================================
## 实现请求处理部分
## ==========================================================================
## 定义处理cmd命令的类
class CmdHander:
## 定义 get 方法
def GET(self, name):
## name 是cmd/命令后的子命令 例如x.x.x.x:8080/cmd/test ----> name = 'test'
## return 将结果直接返回调用方
return xxx
## 定义 post 方法
def POST(self,name):
print name #同样 name 是cmd/命令后的子命令,如果x.x.x.x:8080/cmd/test/123 ----> name = 'test/123'
print web.data() ## web.data()是接收到的post的参数
print type(web.data()) ## 类型是字符串
#--------------------------------------------------------------------------------------
# 1.使用 requests 方式调用 (import requests)
# r = requests.post('http://127.0.0.1:8888/cmd/test',{"aaa":123,"BBB":112})
# 调用方获取返回值:
# r.status_code ----> 执行状态码(成功:200,失败:404/500/......)
# r.headers ----> 返回头 例如:{'Transfer-Encoding': 'chunked', 'Date': 'Mon, 09 Jul 2018 08:25:25 GMT', 'Server': 'localhost'}
# r.text ----> get/post 方法返回的值
# 2.使用 urllib2
# url='http://127.0.0.1:8888/cmd/test'
# headers = {'Content-Type': 'application/json'}
# request = urllib2.Request(url, headers=headers, data=json.dumps(data))
# response.code ----> 执行状态码(成功:200,失败:404/500/......)
# response.headers ----> 返回头
# response.read() ----> get/post 方法返回的值
# 更多可以通过dir(response)查看
#________________________________________________________________________________________
# 编码方式:
# * 未编码,(直接使用curl 或 requests.post/request(url,data) = urllib2.Request(url, headers, data)的:
# web.data() = aaa=123&BBB=112
# 转换字典方式:dict(urlparse.parse_qsl(web.data()))
# * 使用json编码的 :
# 使用json.dumps 对 {"aaa":123,"BBB":112} 进行编码
# 例如:requests.post/request(url,json.dumps(data)) 或 request = urllib2.Request(url, headers=headers, data=json.dumps(data))
# web.data() = "{"age": 13, "name": "mac"}" (json字符串)
# 转换字典方式: dic = json.loads(web.data())
#---------------------------------------------------------------------------------------
## return 将结果直接返回调用方
return "get"
3.关于并发
webpy 可以并发,也就是说当同时多次调get/post方法时,不会因为之前的请求耗时,未执行完而导致新的请求阻塞。
同步阻塞问题在 python tornado 框架中再继续学习。
4. demo
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @ // sudo apt install python-webpy
# @ // sudo pip install web.py
# @ // sudo pip install flask
import web
import sys
import json
reload(sys)
sys.setdefaultencoding('utf-8')
import urlparse
import time
urls = (
'/cmd/(.*)', 'hello'
)
app = web.application(urls, globals())
class hello:
def GET(self, name):
i = web.input(times=1)
print " i: ",i
if not name:
name = 'world'
print "int(i.times): ",int(i.times)
for c in xrange(int(i.times)):
print 'Hello,', name+'!'
ret = 'Hello, ' + name + '!'
time.sleep(10)
return ret.encode("utf-8")
def POST(self,name):
print "============="
print name
print web.data()
print type(web.data())
if "=" in web.data():
#print dict(urlparse.parse_qsl(web.data()))
print urlparse.parse_qsl(web.data())
dic = dict(urlparse.parse_qsl(web.data()))
for key in dic:
print "[",key,"] : ",dic[key]
else:
dic = json.loads(web.data())
for key in dic:
print "[",key,"] : ",dic[key]
return "get"
if __name__ == "__main__":
sys.argv.append("8888") # @ // 其实是在运行python文件的时候 加参数。
app.run()
## 此测试,可通过浏览器打开http://127.0.0.1:8888/cmd/world检测