如何使用ZPublisher.Client.call设置HTTP方法?

时间:2013-03-07 13:15:54

标签: python zope

我尝试使用ZPublisher.Client.call参数调用Zope 2.10.9的method来设置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

Bug report

1 个答案:

答案 0 :(得分:1)

ZPublisher.Client模块非常古老,应该被认为是非维护的。

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

随意将补丁添加到Zope issue tracker