2013-03-07 121 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

相關問題