用ladon框架封装Python为Webservice接口以及调用接口的方法

小编 2026-06-25 阅读:990 评论:0
一、用ladon框架封装Python为Webservice接口                功...

一、用ladon框架封装Python为Webservice接口             

   功能实现的同时,希望将接口开放给别人,而封装python接口的一个再简单不过的框架Ladon,而且提供不同的协议,包括SOAP和Json等格式的接口。本篇紧接着上上篇(Django部署)的。虽然很简单,但是官网的文档还是不够详细,下面介绍我配置的过程及遇到的问题。

1、安装Ladon包

使用Ladon框架,首先需要安装Ladon包(Ladon for Python),最新的是Ladon-0.8.9

2、新建一个APP(接着上个项目的话,就取名叫appapi)

1)、在这个app下面新建一个文件handler.py(实际上就是一个views):

# Create your views here.from ladon.server.wsgi import LadonWSGIApplicationimport osos.environ['DJANGO_SETTINGS_MODULE'] = 'appops.settings'   #这里是项目的名称设置application = LadonWSGIApplication(  ['appapi.views'],  #引用当前目录下views里的内容  [os.path.join(os.path.dirname(__file__), os.path.pardir)],  catalog_name='OPS APP API',  catalog_desc='This is the root of my cool webservice catalog')

在Windows环境下,其实这时会报错,报各种No modules named XXX的错误(上述from ladon.server.wsgi import LadonWSGIApplication 这句话需要三个包),这个好办,缺什么包装什么包,有个这个巨无霸Windows-Python集成包网站,啥都不缺,Ctrl+F就行!注意版本,这里很全,目前Windows下所有python的包都能在这里找到,32位和64位的都有,配置过程中,我就缺了下面三个包:

Jinja2-2.7.2.win32-py2.7.exe

MarkupSafe-0.18.win32-py2.7.exe

docutils-0.11.win32-py2.7.exe

2)、写接口函数(就是APP下的Views.py里的内容),被上面引用的['appapi.views']

以一个加法和减法为例:

from ladon.ladonizer import ladonizefrom ladon.types.ladontype import LadonTypeclass Calculator(object):    @ladonize(int,int,rtype=int)    def add(self,a,b):        return a+b    @ladonize(int,int,rtype=int)    def Minus(self,a,b):        return a-bclass MyService(object):        @ladonize(int,rtype=int)    def mytest(self,a):         return a*a

这里要注意两点:

a、要封装的方法必须写在一个类里(如这里的Class XXX)

b、类下面的方法如果需要封装,则方法前面必须加修饰符@ladonize,后面的参数分别是输入参数的类型和输出参数(return type)的类型

3、编辑配置文件

可以在apache_django_wsgi.conf文件里配置也可以在apache下的httpd.conf文件下配置,加上这句:

WSGIScriptAlias /api "D:/OPSAPP/appops/appapi/handler.py"

意思就是可以通过在主域名(或IP)后面加上/api/就可以访问到接口,而不用在urls.py里的urlpattern里写url了。

这里需要注意:

a、这句与WSGIScriptAlias / "D:/OPSAPP/django.wsgi"的顺序,上述api的别名一定要放在django.wsgi引用的前面,否则导致/api/的页面不能访问(试了很多次,WSGIScriptAlias /api "D:/OPSAPP/appops/appapi/handler.py"这个配置在apache_django_wsgi.conf里有问题,会出现主页和api页面不能同时访问的情况。但是有的同事就可以,不知道哪里配置不一样。我是配置在httpd.conf里的

b、如果不能访问api页面,错误日志会记录在apache目录下的logs/error.log里。配置过程中遇到了这个错误:assert sys.modules[modname] is old_mod 

这个需要改动源码:C:Python27Libsite-packageswin32libpywintypes.py第113行那段改动如下:

 if sys.version_info < (3,0):        # assert sys.modules[modname] is old_mod        # assert mod is old_mod        pass    else:        assert sys.modules[modname] is not old_mod        assert sys.modules[modname] is mod        # as above - re-reset to the *old* module object then update globs.        sys.modules[modname] = old_mod        globs.update(mod.__dict__)

注意:每当修改过配置文件或者代码时,最好重启下apache服务,不然可能页面看不出改动后的效果。

至此没问题了,访问URL/api的界面如下:

用ladon框架封装Python为Webservice接口以及调用接口的方法

点击Calculator接口,他提供了不同格式的接口类型:

用ladon框架封装Python为Webservice接口以及调用接口的方法

我常用的就是第一个soap11类型的接口,点进去如下(不明觉厉,有木有): 

用ladon框架封装Python为Webservice接口以及调用接口的方法用ladon框架封装Python为Webservice接口以及调用接口的方法
This XML file does not appear to have any style information associated with it. The document tree is shown below.<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ns1="urn:Calculator" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:Calculator" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Calculator" targetNamespace="urn:Calculator"><wsdl:types><xsd:schema xmlns:ns1="urn:Calculator" targetNamespace="urn:Calculator"><xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/></xsd:schema></wsdl:types><wsdl:message name="add"><wsdl:part name="a" type="xsd:long"/><wsdl:part name="b" type="xsd:long"/></wsdl:message><wsdl:message name="addResponse"><wsdl:part name="result" type="xsd:long"/></wsdl:message><wsdl:message name="minus"><wsdl:part name="a" type="xsd:long"/><wsdl:part name="b" type="xsd:long"/></wsdl:message><wsdl:message name="minusResponse"><wsdl:part name="result" type="xsd:long"/></wsdl:message><wsdl:portType name="CalculatorPortType"><wsdl:operation name="add"><wsdl:input message="tns:add"/><wsdl:output message="tns:addResponse"/></wsdl:operation><wsdl:operation name="minus"><wsdl:input message="tns:minus"/><wsdl:output message="tns:minusResponse"/></wsdl:operation></wsdl:portType><wsdl:binding name="Calculator" type="tns:CalculatorPortType"><soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="add"><soap:operation soapAction="http://192.168.18.74/api/Calculator/soap11/add" style="rpc"/><wsdl:input><soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Calculator" use="encoded"/></wsdl:input><wsdl:output><soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Calculator" use="encoded"/></wsdl:output></wsdl:operation><wsdl:operation name="minus"><soap:operation soapAction="http://192.168.18.74/api/Calculator/soap11/minus" style="rpc"/><wsdl:input><soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Calculator" use="encoded"/></wsdl:input><wsdl:output><soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:Calculator" use="encoded"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="Calculator"><wsdl:documentation>Ladon generated service definition</wsdl:documentation><wsdl:port binding="tns:Calculator" name="Calculator"><soap:address location="http://192.168.18.74/api/Calculator/soap11"/></wsdl:port></wsdl:service></wsdl:definitions>
View Code

  

二、接口调用方法                                   

1、调用Soap11的接口

需要安装soap 的Client端包,大名叫做Suds(我的版本是suds-0.4),调用很简单,如下一个示例,不解释,聪明的你一看就明白:

#encoding:utf-8import json# import urllib,urllib2from suds.client import Client# import logging# logging.basicConfig(level=logging.INFO)# logging.getLogger('suds.client').setLevel(logging.DEBUG)
# username = 'api_user'
# password = 'api_pwd'
url="http://192.168.18.74/api/Calculator/soap11/description" #接口的URLheaders = {'Content-Type': 'application/soap+xml; charset="UTF-8"'}client = Client(url,headers=headers,faults=False,timeout=15)def call_api_test(num1,num2): try: #--WSDL请求Header---------------------------------------------- # auth = client.factory.create('AuthenticationInfo') # auth.userName = username # auth.password = password # client.set_options(soapheaders=auth) #--WSDL请求Body---------------------------------------------- result = client.service.add(a=num1,b=num2) #print result if result[0] == 200: return (True, result[1]) else: return (False, result[1]) except Exception as e: return (False, e)if __name__ == '__main__': #get_software a= call_api_test(2,3) print (json.loads(a[1]))

 

2、调用Json格式的接口

……

 

 

 

 

作者:zhoujie
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,不然我担心博客园找你算账
如果您觉得本文对你有帮助,请竖起您的大拇指右下角点推荐,也可以关注我
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表