如何添加一个静态文件夹,其中包含一些SOAP客户端所需的wsdl和xsd文件,以及它与我的Odoo 11自定义模块的相关路径?
------------更新---------
我在模块中创建了一个静态文件夹,其中包含src文件夹,其中包含我想要的文件。需要从我的控制器访问这些文件,正确的完整路径是什么?我应该在使用之前在任何地方添加该路径吗?
这是我试图使用文件的控制器:
检查提供给客户端的路径(zeep_test / static / src / uhud / Uhud.wsdl)
from zeep import Client, Settings, xsd
import datetime
from odoo import http
from lxml.etree import tostring
class WaseelCrm(http.Controller):
@http.route('/test/zeep', type='json', methods=['POST'], auth="public", website=True, csrf=False)
def test_zeep(self):
settings = Settings(strict=False, xml_huge_tree=True)
client = Client('zeep_test/static/src/uhud/Uhud.wsdl', settings=settings)
factory = client.type_factory('ns0')
transaction = factory.TransactionCT('1.1', 'NEW', None, None, 'REQUEST')
user = factory.UserCT('admin', 'admin', 'Ahmed Yasser')
interaction = factory.InteractionCT(None, 102, 2260, 101)
timestamp = datetime.datetime.combine(datetime.datetime.now(), datetime.time(10, 23))
cmh = factory.MessageHeaderCT(transaction, interaction, user, timestamp)
member = factory.MemberCT('0020693108', '20693101', '158')
visitInfo = factory.visitInfoCT(timestamp, 7, 'NEW')
eligibilityRequest = factory.EligibilitySubmissionRequestCT(member, visitInfo)
with client.settings(raw_response=False):
response = client.service.submitSchema(CommonMessageHeader=cmh,
EligibilitySubmissionRequest=eligibilityRequest)
return response
这是这些文件所在的位置 Folder's Path
答案 0 :(得分:1)
感谢您使用更具体的细节和代码来更新问题。您正在尝试从Odoo Python代码访问wsdl,而不是从外部作为Odoo发布的静态http内容访问。
我看到您有四种可能的方法来解决此问题:
使用相对路径访问wsdl并修改代码以使其成为可能。这是首选方式。此代码可在控制器中工作,也可在模块根目录下一级的任何其他目录中的python代码中工作。
wsdlpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../zeep_test/static/src/uhud/Uhud.wsdl')
client = Client(wsdlpath, settings=settings)
使用绝对路径访问wsdl。更新您的代码以在zeep Client调用中包含完整的绝对路径。在此选项中,您需要对绝对路径进行硬编码。这行得通,但是不好。
client = Client('/mnt/extra-addons/zeep_test/static/src/uhud/Uhud.wsdl', settings=settings)
通过具有http地址的Odoo http服务访问wsdl。在此解决方案中,您需要在Odoo服务器看到的情况下对您的Odoo地址进行硬编码。
client = Client('http://localhost:8069/zeep_test/static/src/uhud/Uhud.wsdl', settings=settings)
直接从SOAP服务提供者访问wsdl。这样,您需要从服务提供商处访问wsdl。这样,您将不需要本地的wsdl。
client = Client('https://serviceprovider.com/xx/yy/Uhud.wsdl', settings=settings)
当前,您的wsdl位于公共可用的静态文件夹中。您是否真的要在Odoo中发布它?如果您没有特别的意图,我会考虑不发布此版本。如果您使用内部地址(案例1和2)从代码中引用此文件,则无需发布它。
答案 1 :(得分:0)
您可以构建Odoo模块,并将静态wsdl和xsd包含在名为static的模块文件夹中。您可以从以下资源中找到更多信息和有关创建模块的帮助:
在创建模块时,如果您无法从Odoo参考资源中找到针对特定编程难题的答案,请考虑在此处的堆栈溢出中进行询问。对于Stack Overflow问题,请提供准确且可复制的问题代码,以便人们能够为您提供最佳帮助。您可以在https://stackoverflow.com/help/how-to-ask上找到有关常见问题的说明。欢迎来到Zatar的Stack Overflow。
答案 2 :(得分:0)
好吧,我不知道所有答案是否都正确,但是您要找到Costum模块的路径的方式就是这样。
# you need http this
import os
from odoo import http
# from openerp import http
# in your method to find the path of your costum module
file_path = http.addons_manifest['zeep_test']['addons_path'] # I really forget the key but you can check controllers in web module you find plenty of examples there
# now you can join this file path with your static folder use os for this to handle multi platform
file_path = os.path.join('zeep_test', 'static', 'src', 'uhud','Uhud.wsdl')
# and now file_path have the right path for your file
向addons_manifest添加插件的一件事,插件必须具有静态文件夹。而且您应该对此没有问题,因为您有此问题。
一件事,如果您仅在python中访问此文件,请从静态文件夹中删除它们以保护它们