一、功能需求

本次案例是开发一个Item的新建的WebService。IN&OUT的类型JsonDocument。

通过传入相关的参数创建Item,且相关的参数可以被缺省。

二、Spyne的安装

pip install spyne

对于Python3

pip install spyne==2.13.4a1

三、实现代码

引入类

from spyne import Application,rpc,ServiceBase,Iterable,Integer,Unicode
#如果支持soap的协议需要用到Soap11
from spyne.protocol.soap import Soap11
#如果开发传入传出为Json需要用到JsonDocument
from spyne.protocol.json import JsonDocument
#可以创建一个wsgi服务器,做测试用
from spyne.server.wsgi import WsgiApplication
#将Spyne创建的app 发布为django
from django.views.decorators.csrf import csrf_exempt
#创建一个负责数据类型
from spyne.model.complex import ComplexModel
#引用其他的APP
from ItemAPI import APP_Item

创建ItemData的相关属性

class ItemData(ComplexModel):
__namespace__ = 'itemData'
ItemCode=Unicode
SearchCode=Unicode
ItemName=Unicode
Assortment=Unicode
Brand=Unicode
Material=Unicode
ItemSource=Unicode
Category=Unicode
Series=Unicode
Model=Unicode
CostType=Unicode
WareHouse=Unicode
WareHouseLocation=Unicode
Width=Unicode
Length=Unicode
Height=Unicode
Volume=Unicode
Size=Unicode
GLAccountCost=Unicode
GLAccountRevenue=Unicode
GLAccountDistribution=Unicode
SalesPrice=Unicode
CostPrice=Unicode
VatCode=Unicode
IsHarbin=Unicode
IsBatchItem=Unicode
CountryCode=Unicode

创建ItemData相关属性

创建ItemAPI

#创建API
class ItemAPIService(ServiceBase):
#传入参数ItemData,由之前定义的
@rpc(ItemData, _returns=Iterable(Unicode))
def item_api(ctx,itemData):
fieldList=['ItemCode','SearchCode','ItemName','Assortment','Brand','Material','ItemSource','Category','Series','Model','CostType','WareHouse','WareHouseLocation','Width','Length','Height','Volume','Size','GLAccountCost','GLAccountRevenue','GLAccountDistribution','SalesPrice','CostPrice','VatCode','IsHarbin','IsBatchItem','CountryCode']
dict_Data={}
#itemData 会默认将未传值的根据顺序赋Null
for field,value in zip(fieldList,itemData):
if value is not None:
dict_Data[field]=value
#yield f"{field}={value}"
#返回运行结果
yield APP_Item(dict_Data) #定义API的输入输出类型,如果需要支持Soap可以参考网页http://spyne.io
application = Application([ItemAPIService],
tns='spyne.item.api',
in_protocol=JsonDocument(validator='soft'),
out_protocol=JsonDocument()
)
#定义DjangoApplication
item_app = csrf_exempt(DjangoApplication(application))
if __name__ == '__main__':
# You can use any Wsgi server. Here, we chose
# Python's built-in wsgi server but you're not
# supposed to use it in production.
from wsgiref.simple_server import make_server
wsgi_app = WsgiApplication(application)
server = make_server('0.0.0.0', 8000, wsgi_app)
server.serve_forever()

四、对接口进行测试

import http.client,urllib.parse
import json
import requests headers = {'Content-Type': 'application/json'}
requrl = f"http://127.0.0.1:8000/"
dict_Data={}
dict_Data["ItemCode"]="M09HLE220200030000"
dict_Data["ItemName"]="测试"
dict_Data["WareHouse"]=""
dict_Data["CountryCode"]="CN"
dict_Data["CostType"]="M-17XAC02-240"
dict_Data["Series"]="" #item_api是spyne的function名,itemData是传入参数名
postdata=json.dumps({"item_api": {"itemData":dict_Data}})
print(postdata) req = requests.post(requrl,data=postdata)
print(json.loads(req.text))

四、Django配置

之前的spyne的app位于view.py中

from . import view
#item_app是view中定义的django应用名
urlpatterns = [
url(r'^WebAPI/',view.item_app),]

基于Python的Webservice开发(二)-如何用Spyne开发Webservice的更多相关文章

  1. Python科学计算(二)windows下开发环境搭建(当用pip安装出现Unable to find vcvarsall.bat)

    用于科学计算Python语言真的是amazing! 方法一:直接安装集成好的软件 刚开始使用numpy.scipy这些模块的时候,图个方便直接使用了一个叫做Enthought的软件.Enthought ...

  2. Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架

    一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  3. 小白学习python之路(二):安装开发工具

    引言 上一章我们安装配置了python3.7,这一章我们安装python的开发工具,我用的pycharm2019 安装 工具连接:https://u20538204.ctfile.com/fs/205 ...

  4. python运维开发(二十五)---cmdb开发

    内容目录: 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infr ...

  5. 初识TPOT:一个基于Python的自动化机器学习开发工具

    1. TPOT介绍 一般来讲,创建一个机器学习模型需要经历以下几步: 数据预处理 特征工程 模型选择 超参数调整 模型保存 本文介绍一个基于遗传算法的快速模型选择及调参的方法,TPOT:一种基于Pyt ...

  6. Python服务器开发二:Python网络基础

    Python服务器开发二:Python网络基础   网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.包括: ...

  7. 基于python的互联网软件测试开发(自动化测试)-全集合

    基于python的互联网软件测试开发(自动化测试)-全集合 1   关键字 为了便于搜索引擎收录本文,特别将本文的关键字给强调一下: python,互联网,自动化测试,测试开发,接口测试,服务测试,a ...

  8. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)

    目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构   前言 学习Python也有一个半月时间了,学到现在感觉 ...

  9. 基于Python的Web应用开发实践总结

    基于Python的Web应用开发学习总结 项目地址   本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...

随机推荐

  1. 【原创】从Rest到Graphql

    引言 开局两张图,内容全靠编- ok,如图所示,我在去年曾经写过一篇文章<闲侃前后端分离的必要性>.嗯,我知道肯定很多人没看过.所以我做一个总结,其实啰里八嗦了一篇文章,就是想说一下现在的 ...

  2. Mysql数据库引擎介绍--转载

    引用博文链接:https:/www.cnblogs.com/zhangjinghe/p/7599988.html MYSQL数据库引擎区别详解 数据库引擎介绍 MySQL数据库引擎取决于MySQL在安 ...

  3. 团队开发项目--NABCD模型

    N(need)需求: 鉴于在学校中的大部分爱学习的学生平时都去拍空教室的占有情况,我们发现有的时候太多,导致同学们们拍照会浪费很长的时间,而且空教室的显示不是一下子全出来,有的时候还会出现无法显示的情 ...

  4. 禁止Cnario Player启动后自动开始播放

    Cnario Player安装激活后, 默认开机后自动启动, 启动加载内容完成后进入10秒倒计时, 10秒后即开始播放关机前播放的内容. 如果不想让其自动开始播放, 可按照如下办法设置其不自动播放. ...

  5. git 版本回滚

    1.克隆代码到本地 git clone http://qtools@dev.qtoolsbaby.cn:81/gitlab/qtools/jenkins_ceshi.git 2.git log 查看所 ...

  6. bugku 逆向 take the maze

    看到如果判断正确之后 会生成一个png文件 直接用idc脚本生成: auto v,begin,end,dexbyte; v = fopen("flag.png", "wb ...

  7. subprocess

    在没有subprocess这个模块的时候,我们怎么去跟我们的操作系统做交互的呐?下面我们先说说这三个模块:os.system().os.popen().commands. 1.  os.system( ...

  8. 第六届SD省赛 Circle of Friends

    Circle of Friends Time Limit: 2000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  9. Python unittest 测试输入(input)和输出(print)

    Python 自带的 unittest 库可以用来写单元测试. 测试输入输出的解决方法是: 将标准输入输出定向到一个StringIO类(python3是 io.StringIO). import un ...

  10. <TCP/IP原理> (三) 底层网络技术

    传输介质 局域网(LAN) 交换(Switching) 广域网(WAN) 连接设备 第三章 底层网络技术 引言 1)Interne不是一种新的网络 建立在底层网络上的网际网 底层网络——“物理网”,网 ...