python模块restful使用方法实例
admin
2023-07-31 02:01:57
0

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简易框架。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...