1

我正在尝试在 python Google App Engine 应用程序中使用 suds。这是回溯:

client = Client(url)
  File "/base/data/home/apps/sandbox/test.349741318547153856/suds/client.py",
line 109, in __init__
    options.cache = ObjectCache(days=1)
  File "/base/data/home/apps/sandbox/test.349741318547153856/suds/cache.py",
line 141, in __init__
    location = os.path.join(tmp(), 'suds')
  File "/base/python_runtime/python_dist/lib/python2.5/tempfile.py",
line 45, in PlaceHolder
    raise NotImplementedError("Only tempfile.TemporaryFile is
available for use")
NotImplementedError: Only tempfile.TemporaryFile is available for use

我尝试在client.py更改第 109 行:

options.cache = ObjectCache(days=1)

至:

options.cache = None

它现在有效,但我不确定这是否会影响未来的某些事情。

如果有人可以在这里帮助我,我真的很感激。

提前致谢。

4

2 回答 2

2

您无法在 appengine 中写入本地文件。这就是为什么您会遇到错误,它试图将已处理的 WSDL 缓存写入临时文件。您将不必缓存或提供备用缓存机制。我在带有非常昂贵的 WSDL 文件的 appengine 上使用 suds,所以我破解了缓存以在开发服务器文件系统上写入缓存,然后使用部署的代码上传缓存。

我作弊 - 有点。

def precache_wsdl(wsdl,principal):
    log = logging.getLogger()
    log.setLevel = logging.info
    cache_location = os.path.join(os.path.dirname(__file__),"cache")
    security = Security()
    token = UsernameToken(*principal)
    security.tokens.append(token)
    client = Client(wsdl,cache=FileCache(cache_location))
    client.set_options(wsse=security)

我在我的 appengine 代码中定义了这段代码。加载远程命令 api,在本地运行,预填充缓存。然后我确定在我的真实 appengine 代码中正确设置了 cach_location。当您在 remote_api shell 中运行时,您不会受到与服务器代码相同的限制。事实上,你甚至不必在 shell 下运行它,但我倾向于这样做。

于 2012-08-14T09:21:04.117 回答
2

使用 pip 中的 jurko-suds,并cache=在构造函数中设置。

from suds.cache import NoCache
[...]
client = Client(url, cache=NoCache())
于 2016-10-22T18:41:16.573 回答