出现错误类型错误:create_task() 需要 1 到 2 个位置参数,但在创建谷歌云任务时给出了 3 个

Posted

技术标签:

【中文标题】出现错误类型错误:create_task() 需要 1 到 2 个位置参数,但在创建谷歌云任务时给出了 3 个【英文标题】:Getting Error TypeError: create_task() takes from 1 to 2 positional arguments but 3 were given while creating google cloud tasks 【发布时间】:2021-01-03 08:05:15 【问题描述】:
from google.cloud import tasks_v2

import json


GCP_PROJECT='test'
GCP_LOCATION='europe-west6'


def enqueue_task(queue_name, payload, process_url):
  client = tasks_v2.CloudTasksClient()
  parent = client.queue_path(GCP_PROJECT, GCP_LOCATION, queue_name)

  task = 
    'app_engine_http_request': 
      'http_method': 'POST',
      'relative_uri': process_url
    
  

  if payload is None:
    return False

  payload = json.dumps(payload)
  converted_payload = payload.encode()

  task['app_engine_http_request']['body'] = converted_payload
  return client.create_task(parent, task)

我在尝试创建 Google Cloud Task 时不断收到以下错误。 使用的 Google App Engine 运行时是 python38。它工作正常,但在使用 gcp CLI 部署后突然无法正常工作。

Traceback (most recent call last):
  File "/layers/google.python.pip/pip/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/layers/google.python.pip/pip/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/layers/google.python.pip/pip/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/layers/google.python.pip/pip/flask/_compat.py", line 39, in reraise
    raise value
  File "/layers/google.python.pip/pip/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/layers/google.python.pip/pip/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/srv/main.py", line 153, in sync_request
    queue_response = queues.enqueue_task(
  File "/srv/queues.py", line 28, in enqueue_task
    return client.create_task(parent, task)
TypeError: create_task() takes from 1 to 2 positional arguments but 3 were given

【问题讨论】:

【参考方案1】:

同样的事情刚刚发生在我身上(在实时服务器上:/)。事实证明,Cloud Tasks 库在 2.0.0 版本中发生了显着变化。你可以阅读what you need to do to upgrade here。

你的问题出在这一行:

client.create_task(parent, task)

更新后的库需要使用字典作为位置参数或使用关键字参数。所以这应该解决它:

client.create_task(parent=parent, task=task)

编辑:现在我已经为自己完成了这项工作,现在查看您的代码,您还必须更改以下内容:

# Before
parent = client.queue_path(GCP_PROJECT, GCP_LOCATION, queue_name)
# After
parent = client.queue_path(project=GCP_PROJECT, location=GCP_LOCATION, queue=queue_name)

# Before
'http_method': 'POST',
# After
'http_method': tasks_v2.HttpMethod.POST,

【讨论】:

是的,这对我有用。即使我在现场环境中面对它。这似乎是 google-cloud-tasks 2.0.0 版的问题。此外,将版本降级到 1.5.0 使代码无需任何更改即可工作。

以上是关于出现错误类型错误:create_task() 需要 1 到 2 个位置参数,但在创建谷歌云任务时给出了 3 个的主要内容,如果未能解决你的问题,请参考以下文章

一段时间后出现错误:“内容类型与 JSON 不兼容”

bot.loop.create_task 函数不起作用 - Python Discord Bot

asyncio.create_task() 做啥?

为什么这个CASE表达式会出现“不一致的数据类型”错误?

反应错误:元素类型无效:需要一个字符串

nodejs通过函数名进行静态方法调用出现类型错误,为啥?