2013-03-07 122 views
0

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

施药代码:

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) 

OK,所以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__,还是我误解了一些东西?如果它是一个真正的错误,这里有一个建议的补丁(对我的作品™):

--- 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 

Bug report

回答

1

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

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

随意将补丁添加到Zope issue tracker

+0

+1我创建了一个bug报告,如OP所述。 – l0b0 2013-03-18 09:29:16

相关问题