我正在尝试在金字塔中实现批量请求方法。我在文档中看到它是用
完成的subrequest = Request.blank('/relative/url')
request.invoke_subrequest(subrequest)
我只是想知道你如何传递标题和cookie?它已经为你完成了还是
request.invoke_subrequest(subrequest, cookies=request.cookies, headers=request.headers)
不同方法的参数怎么样?文档只有POST
关键字arg。
我觉得文档有点模糊,或者我找不到关于如何做到这一点的正确文档。感谢
答案 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)
其他标头信息(例如accept
,accept_encoding
等)是pyramid.request个对象的属性,可以添加到kwargs
字典中,如代码中所示上面的片段。
invoke_subrequest()
返回的对象是一个记录为here的响应对象。