如何摆脱`警告从URLFetch请求剥离禁止的标题'

时间:2017-04-28 11:25:32

标签: python-2.7 google-app-engine google-bigquery

情况:

从python处理程序请求Google Bigquery时,此警告会显示六次

WARNING  2017-04-28 10:01:55,450 urlfetch_stub.py:550] Stripped prohibited headers from URLFetch request: ['content-length']

然后它提出截止日期异常或成功终止请求。

HTTPException: Deadline exceeded while waiting for HTTP response

(成功/截止日期例外比率约为2/1)

以下是我如何从python处理程序执行请求:

import uuid

from google.cloud import bigquery

client = bigquery.Client()
q = client.run_async_query(str(uuid.uuid4()),("SELECT * FROM my_table"))
q.use_legacy_sql = False
q.allowLargeResults = True
q.begin()
wait_for_job(q)
res = q.results()

问题:如何防止发生警告?

问题:查询返回的警告被GAE捕获为失败,并使处理程序重新发送查询,直到成功或截止日期异常confirmation source为止。这是有问题的,因为它会增加执行请求所需的时间。

额外信息: 在我当前的python处理程序中,我一个接一个地运行三个不同的请求。虽然根据时间发生变化,但Warning消息的数量对于三个请求是相同的。 例如。: 请求1:3警告,然后请求2和3将有三次警告消息。 等5分钟 请求1:6警告,然后请求2和3将有六次警告消息。

2 个答案:

答案 0 :(得分:1)

此警告出现在新的大查询客户端上。 此代码有效:

from oauth2client.contrib.appengine import AppAssertionCredentials
from apiclient.discovery import build
import httplib2

credentials = AppAssertionCredentials('https://www.googleapis.com/auth/sqlservice.admin')
http = httplib2.Http()
http = credentials.authorize(http)
service = build('bigquery', 'v2', http=http)
query = "SELECT * FROM [" + table + "]"
           body = {'query': query, 'timeoutMs': 2000}
           result = service.jobs().query(projectId=PROJECT_ID, body=body).execute()

答案 1 :(得分:0)

因此,GAE似乎默认剥离/修改所有出站HTTP请求的特定标头:see link here。此外,在深入了解google-cloud-python客户端库中的核心HTTP帮助程序后,默认行为似乎是添加content-length标头:see code here

虽然在你的情况下这些都不是理想的,但我认为它不应该是一个破坏者。我认为添加try...catch子句应该有助于减轻痛苦,尽管您将继续在日志中显示这些错误。此外,您可以在例外e上插入print type(e),以便从日志中找到有关例外的更多信息。请参阅对话here