我尝试使用ZPublisher.Client.call
参数调用Zope 2.10.9的method
来设置HTTP方法(GET
,POST
等),但它不是按预期工作:它总是发送一个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
答案 0 :(得分:1)
ZPublisher.Client
模块非常古老,应该被认为是非维护的。
是的,call()
函数无法处理更改method
,并按照您建议的方式添加方法处理。解决方法是不使用call()
函数,而是直接使用Function()
类。
随意将补丁添加到Zope issue tracker。