金字塔调用子请求

时间:2014-05-15 20:06:34

标签: python pyramid

我正在尝试在金字塔中实现批量请求方法。我在文档中看到它是用

完成的
subrequest = Request.blank('/relative/url')
request.invoke_subrequest(subrequest)

我只是想知道你如何传递标题和cookie?它已经为你完成了还是

request.invoke_subrequest(subrequest, cookies=request.cookies, headers=request.headers)

不同方法的参数怎么样?文档只有POST关键字arg。

我觉得文档有点模糊,或者我找不到关于如何做到这一点的正确文档。感谢

3 个答案:

答案 0 :(得分:3)

我只是想知道你如何传递标题和cookie?

来自http://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/subrequest.html#subrequest-chapter

  

pyramid.request.Request.invoke_subrequest()API接受两个   arguments:必须提供的位置参数请求,以及   use_tweens关键字参数是可选的;它默认为False。

这告诉我们构造函数只需要一个Request对象,可选择use_tweens的值,所以不,这个

request.invoke_subrequest(subrequest, cookies=request.cookies, headers=request.headers)

无效。

然后,从http://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/subrequest.html

  

将原始请求对象用作参数是一个不好的主意   invoke_subrequest()。您应该构建一个新请求   在上面的例子中演示,使用   pyramid.request.Request.blank()。 一旦构建了请求   对象,你需要按摩它以匹配你可以调用的视图   喜欢在子请求期间执行。这可以通过   调整子请求的URL,标题,请求方法和   其他属性。 pyramid.request.Request的文档   公开你应该调用的方法和你应该设置的属性   你创建的请求按摩它实际上的东西   匹配您要通过子请求调用的视图。

基本上,您需要在将请求传递给invoke_subrequest()之前配置您的请求。

幸运的是an entire page that documents the Request class。在那里我们可以找到很多选项来配置它等等。


不同方法的参数怎么样?文档只有一个POST关键字arg。

同样在Request class文档页面上,有这个

  

方法

     

获取并设置环境中的REQUEST_METHOD键。

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/viewconfig.html上我找到了

  

request_method此值可以是字符串(通常为“GET”,“POST”,   表示HTTP REQUEST_METHOD的“PUT”,“DELETE”或“HEAD”

我必须同意你的意见,文档在这里和那里有点模糊,但我认为你可以像这样使用它

request.method = 'POST'
# Or
request.method = 'GET'
# Etc.

<强>摘要

你会想要这样做

subrequest = Request.blank('/relative/url')
# Configure the subrequest object
# set headers and other options you need.
request.invoke_subrequest(subrequest)

注意

我知道这不是一个100%完整的答案,你可以复制粘贴的一些代码,它只是工作(特别是关于配置请求对象),但我认为这个答案包含一些信息,在非常至少,会让你走上正确的轨道,我希望它对你有所帮助。

答案 1 :(得分:3)

以下代码对我有用。它复制所有(标题,cookie,查询字符串,帖子参数等):

def subrequest(request, path):
    subreq = request.copy()
    subreq.path_info = path
    response = request.invoke_subrequest(subreq)
    return response

答案 2 :(得分:0)

有些晚了,但基于以上两个答案,我就是这样做的。我并不像above answer那样只是复制一切。查看blank() method的文档,有一个kw参数,它说

  

所有必需的密钥都将添加到environ中,但您传入的值将优先。如果您传入base_url,则将从该值填写wsgi.url_scheme,HTTP_HOST和SCRIPT_NAME。

假设视图的请求包含您的子请求所需的正确标题信息和Cookie,您可以使用以下代码:

@view_config( ... )
def something(request):
    ...
    kwargs = { "cookies": request.cookies,                                  
               "host"   : request.host,                                     
             }                                                              
    req = Request.blank("/relative/url", **kwargs)
    resp = request.invoke_subrequest(req)                                   

其他标头信息(例如acceptaccept_encoding等)是pyramid.request个对象的属性,可以添加到kwargs字典中,如代码中所示上面的片段。

invoke_subrequest()返回的对象是一个记录为here的响应对象。