0

我尝试ZPublisher.Client.call使用method参数调用 Zope 2.10.9 来设置 HTTP 方法(GETPOST等),但它没有按预期工作:它总是发送一个 POST 请求。如果我不提供method参数,它总是发送一个 GET 请求。

申请代码:

Client.call(
    'http://...',
    username = 'jdoe',
    password = 'mypw',
    method = 'GET')

我在Client.py中对其进行了一些跟踪:

def call(url,username=None, password=None, **kw):
    return apply(Function(url,username=username, password=password), (), kw)

好的,所以kw = { 'method': 'GET' }。据我所知,这转化为

Function.__init__(
    'http://...',
    username = 'jdoe',
    password = 'mypw'
).__call__(
    method = 'GET')

Function.__init__期望method作为其参数的一部分,但它没有在那里传递:

    def __init__(self,url,
                 arguments=(),method=None,username=None,password=None,
                 timeout=None,
                 **headers):
        ...
        if method is not None: self.method=method

Function.__call__预计method已经设置:

    def __call__(self,*args,**kw):
        method=self.method

应该修改call签名和apply调用以适应__init__,还是我误解了什么?如果它真的是一个错误,这里有一个建议的补丁(Works For Me™):

--- Client.py.orig
+++ Client.py
@@ -271,9 +271,9 @@

         return f

-def call(url,username=None, password=None, **kw):
+def call(url, arguments=(), method=None, username=None, password=None, timeout=None, **kw):

-    return apply(Function(url,username=username, password=password), (), kw)
+    return apply(Function(url, arguments=arguments, method=method, username=username, password=password, timeout=timeout), (), kw)

 ##############################################################################
 # Implementation details below here

错误报告

4

1 回答 1

1

ZPublisher.Client模块真的很古老,应该被认为是未维护的,真的。

是的,该call()函数不处理更改method, 并按照您建议的方式添加处理方法。解决方法是不使用该call()函数,而是Function()直接使用该类。

随意将补丁添加到Zope 问题跟踪器

于 2013-03-07T17:14:28.947 回答