python模块restful使用方法实例


Posted in Python onDecember 10, 2013

RESTful架构,目前是比较流行的一种互联网软件架构。REST,即Representational State Transfer的缩写。

说白点就是网站即软件,再白点就是一个服务软件支持http的四种方法:

GET用来获取资源,POST用来新建资源、更新资源,PUT用来更新资源,DELETE用来删除资源。

并对外提供一个或多个URI,每个URI对应一个资源;客户端通过URI配合上面的方法就可以和服务

段的软件交互。客户端主要是浏览器,使用restful框架的软件对http的支持也为了web应用带来方便。

REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。他的贡献很多,

可以了解一下。本人工作的方向是SDN,也算是比较潮的东东,其中floodlight就用到了restful框架。

开发者为软件开发出一些功能,并提供URI api,用户就可以利用浏览器、curl等工具通过提供的URI

从软件中获得想要的信息或者设置软件的功能。

对于发开者来说,就是提供URI和URI对应的资源,并将他们对应上,类似dicts={'/path?':resource}。

比如重写http GET方法:首先获得客户端请求的url,解析url然后判断其对应的URI,由于URI与应一个资源,

那么url就可以访问这个资源了。具体实现上资源也就是方法或者一个类,要看具体实现了。

下面来个很简单的例子,因为对于真正功能强大的restful来说,这个例子有几点不足,但是作为简单的演示,

应该够了。

#-*-coding:UTF-8-*-
import socket,sys,urllib
from BaseHTTPServer import *
class Restful(BaseHTTPRequestHandler):  #所有rest的父类
    def __init__(self,request, client_address, server):
        BaseHTTPRequestHandler.__init__(self,request, client_address, server)
        self.dp=None
        self.router=None
    def basepath(self):
        pass
    def getresetlet(self):
        pass
    def send(self,src):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(src)
        self.wfile.close()
    def done(self):
        self.dp=self.basepath()
        self.router=self.getrestlet()
class Test(Restful):            #测试1
    def test(self):  #这就是一个资源
        return "{\"date\":\"2013-11-19\"}"
    def do_GET(self):  #重写get方法给了通过客户端请求的url找到对应的资源
        self.done()
        for key in self.router.keys():
            tmp=self.dp+key
            if tmp in self.path:
                  self.send(self.router[key]()) #执行资源
    def basepath(self): #这个简单的说就是和下面函数中的路径配合,即/wm/time
        return "/wm"
    def getrestlet(self):  #这儿就是URI与资源对应,这里只有test资源,可以注册多个
        rr={}
        rr['/time']=self.test 
          return rr
class testjson(Restful):      #测试2
    def testjson(self,vpc,vr):  #这里比测试1复杂些,因为参数的值需要从url中获得
        src1="{\"vpc\":1,\"vrouter\":3,\"day\":[1,2,3]}"
        src2="{\"vpc\":1,\"vrouter\":4,\"day\":[23,21,3]}"
        src3="{\"vpc\":5,\"vrouter\":3,\"day\":[13,2,23]}"
        tlist=[src1,src2,src3]
        cmpvpc="\"vpc\":"+vpc
        cmpvr="\"vrouter\":"+vr
        for k in tlist:
            if cmpvpc in k and cmpvr in k:
                return k
    def firewall(self):
        return "{\"filter\":[\"baid.com/\",\"c.cn/\"],\"acl\":{\"accept\":123,\"reject\":321}}"
    def do_GET(self):  #重写GET,解析url,这里的self.path类似:/ins/json?vpc=1&vrouter=3
        self.done()
        print self.path
        if 'vpc' in self.path and 'vrouter' in self.path:
            query=None
            if '?' in self.path:
                query =    urllib.splitquery(self.path)
            key=query[0]+'?'
            param=query[1].split('&') #解析获得属性信息,传递给资源函数
            pdict={}
            for p in param:
                tmp=p.split('=')
                pdict[tmp[0]]=tmp[1]  
            for k in self.router.keys():
                if k in key:
                    self.send(self.router[k](pdict['vpc'],pdict['vrouter'])) #执行资源
        elif 'firewall' in self.path:
            self.send(self.router['/firewall']())
        else:
            self.send("{}")
    def basepath(self):
        return "/ins"
    def getrestlet(self):
        rr={}
        rr['/json?']=self.testjson #注册资源
        rr['/firewall']=self.firewall
        return rr
            
try:
    server=HTTPServer(('',8084),testjson) #测试2
    server.serve_forever()
except KeyboardInterrupt:
    sys.exit(0)

如果运行上面的程序,运行的是测试2,运行后此程序监听8084。

此时在浏览器地址栏输入http://127.0.0.1:8084/ins/json?vpc=1&vrouter=3

得到如下图,本人使用的chrome,安装插件后的效果。

python模块restful使用方法实例

这里仅仅作为演示,程序有有许多不足。对于好的框架,注册资源不应该和资源在同一个类中,

basepath()与getrestlet()不应该在实现的资源类里(也就是上面的测试里),也使router没起作用。

应该在另一个类里注册,这样可以通过不同的URI,两个测试都应该能够运行;还有就是使用的python自带的BaseHTTPServer模块,并不适合做restful。

但是工作过程大体就是这样,后续有时间会写个python版的restful简易框架。

Python 相关文章推荐
浅析Git版本控制器使用
Dec 10 Python
Python测试人员需要掌握的知识
Feb 08 Python
django富文本编辑器的实现示例
Apr 10 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Python argparse模块使用方法解析
Feb 20 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 Python
pytorch实现ResNet结构的实例代码
May 17 Python
python解析模块(ConfigParser)使用方法
Dec 10 #Python
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 #Python
python socket网络编程步骤详解(socket套接字使用)
Dec 06 #Python
python3图片转换二进制存入mysql
Dec 06 #Python
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 #Python
python多线程编程方式分析示例详解
Dec 06 #Python
树莓派中python获取GY-85九轴模块信息示例
Dec 05 #Python
You might like
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
FireFox中textNode分片的问题
2007/04/10 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
使用jQuery.fn自定义jQuery翻页插件
2013/01/20 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
JS验证不重复验证码
2017/02/10 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
深入了解js原型模式
2019/05/30 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Python 3中print函数的使用方法总结
2017/08/08 Python
python矩阵的转置和逆转实例
2018/12/12 Python
python使用pandas处理excel文件转为csv文件的方法示例
2019/07/18 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL