python - 从现有 WSDL 构建 Django WebService

标签 python django web-services wsdl

我需要重写现有的 WebService 作为 Django 应用程序的一部分,目标是将 Django 应用程序集成到只能调用此特定 WebService 的遗留系统。

所以我确实有一个非常复杂的 WSDL 文件,其中包含多种方法和庞大的数据结构。有没有办法使用该 WSDL 文件为 Django 中的应用程序生成 stub ,或者我是否必须自己创建所有必要的数据结构和方法签名?

最佳答案

查看Zeep

Zeep 检查 WSDL 文档并生成相应的代码以使用文档中的服务和类型。

views.py(服务器)

from django.http import HttpResponse
from django.views import View
from zeep import Client

class MyConvertKilometer2MilesView(View):
    def get(self, request):
        # <view logic>
        client = Client('http://www.webservicex.net/ConvertSpeed.asmx?WSDL')
        result = client.service.ConvertSpeed(
            100, 'kilometersPerhour', 'milesPerhour')
        return HttpResponse('result')

如果您不确定获得返回的速度(由于 SOAP 的性质),请使用

使用 Zeep 进行命令行测试

如果您想测试中间的东西,您可以使用 Zeep 的命令行界面来简化此操作。

python -m zeep http://www.soapclient.com/xml/soapresponder.wsdl

“zeep”库中的“Client”类用于创建一个客户端对象,该对象将连接到指定的 WSDL 端点“http://www.webservicex.net/ConvertSpeed.asmx?WSDL”。然后,该客户端对象用于调用 Web 服务的“ConvertSpeed”方法,并传入参数“100”、“kilometersPerhour”和“milesPerhour”。

views.py(客户端)

生成客户端 View 的 Django 示例如下:

# views.py (Client)

from django.http import HttpResponse
from django.views import View
from zeep import Client

class MyConvertKilometer2MilesView(View):
    def get(self, request, speed):
        client = Client('http://www.webservicex.net/ConvertSpeed.asmx?WSDL')
        result = client.service.ConvertSpeed(speed, 'kilometersPerhour', 'milesPerhour')
        return HttpResponse(result)

您还需要更新 urls.py 文件中的路由配置,以将此参数包含在 url 路径中。

# urls.py

from django.urls import path
from .views import MyConvertKilometer2MilesView

urlpatterns = [
    path('convert/<int:speed>/', MyConvertKilometer2MilesView.as_view()),
]

关于python - 从现有 WSDL 构建 Django WebService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38729081/

相关文章:

Python:从视频中截取屏幕截图

python - 根据第三个值在图中使用自己的颜色图(无散点图)

python - 如何在python电子邮件脚本中的发件人地址之前添加发件人姓名

python - 如何在 Django 基于类的 View 中限制用户组的访问?

python - ImportError : symbol __res_maybe_init version GLIBC_PRIVATE not defined in file libc. so.6 带链接时间引用

java - 线程中的异常 "main"java.lang.NoSuchMethodError : org. jboss.resteasy.util.CaseInsensitiveMap.add(Ljava/lang/String;Ljava/lang/Object;)V

python - 获取包含特定变量的所有值的数组

python - django TemplateDoesNotExist 异常但模板存在

python - 如何使用 tripit API 制作独立工具?

web-services - 计算服务器上或iOS应用程序上2个点之间的距离哪个更好?