当前位置:  编程技术>python

python模块restful使用方法实例

    来源: 互联网  发布时间:2014-09-04

    本文导语:  RESTful架构,目前是比较流行的一种互联网软件架构。REST,即Representational State Transfer的缩写。 说白点就是网站即软件,再白点就是一个服务软件支持http的四种方法: GET用来获取资源,POST用来新建资源、更新资源,PUT用来更新...

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,安装插件后的效果。

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

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

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

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


    
 
 

您可能感兴趣的文章:

  • 使用setup.py安装python包和卸载python包的方法
  • Python开发的单词频率统计工具wordsworth使用方法
  • python回调函数的使用方法
  • Python的函数嵌套的使用方法
  • Python strip lstrip rstrip使用方法
  • python迭代器的使用方法实例
  • python中的yield使用方法
  • python sys模块sys.path使用方法示例
  • python基础教程之lambda表达式使用方法
  • 使用Python判断IP地址合法性的方法实例
  • c++生成dll使用python调用dll的方法
  • python基础教程之类class定义使用方法
  • 浅析python 内置字符串处理函数的使用方法
  • Python列表推导式的使用方法
  • python生成器的使用方法
  • 跨平台python异步回调机制实现和使用方法
  • Python中使用item()方法遍历字典的例子
  • Python使用函数默认值实现函数静态变量的方法
  • Python yield使用方法示例
  • python中使用urllib2伪造HTTP报头的2个方法
  • Python namedtuple(命名元组)使用实例
  • python使用os模块的os.walk遍历文件夹示例 iis7站长之家
  • Python 3 Tkinter教程之事件Event绑定处理代码实例
  • python调用短信猫控件实现发短信功能实例
  • Python文件操作类操作实例详解
  • python 基础学习第二弹 类属性和实例属性
  • Python实现冒泡,插入,选择排序简单实例
  • Python 时间处理datetime实例
  • Python实现类继承实例
  • Python continue语句用法实例
  • python3编写C/S网络程序实例教程
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python异常模块traceback用法举例
  • Python的多媒体模块 PyMedia
  • Python的MySQLdb模块安装
  • Python的视频设备访问模块 VideoCapture
  • python的urllib模块显示下载进度示例
  • 在Python安装MySQL支持模块的方法
  • linux下用eclipse进行开发,尤其打开较大的python代码模块,老是会卡,请问大家有没有好点的解决办法,如能提供具体设置,不胜感激
  • python使用os模块的os.walk遍历文件夹示例
  • WebSphereMQ的Python模块 PyMQI
  • python发布模块的步骤分享
  • python进阶教程之模块(module)介绍
  • python中的hashlib和base64加密模块使用实例
  • python pickle 和 shelve模块的用法
  • Python下的Mysql模块MySQLdb安装详解
  • python 多进程通信模块的简单实现
  • 从零学python系列之新版本导入httplib模块报ImportError解决方案
  • python爬虫常用的模块分析
  • python正则表达式re模块详解
  • python使用urllib模块开发的多线程豆瓣小站mp3下载器
  • Python Deque 模块使用详解
  • python使用urllib2模块获取gravatar头像实例
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 让python同时兼容python2和python3的8个技巧分享
  • Python不使用print而直接输出二进制字符串
  • 不小心把linux自带的python卸载了,导致安装一个依赖原python的软件不能安装,请问该怎么办?
  • Python中实现json字符串和dict类型的互转
  • Python开发者社区整站源码 Pythoner
  • python异常信息堆栈输出到日志文件
  • python读取csv文件示例(python操作csv)
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • python基础教程之python消息摘要算法使用示例


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3