当前位置: 首页 > 知识库问答 >
问题:

Azure(函数)参数是在Python中声明的,但不是在函数中声明的。json

奚正谊
2023-03-14

我不明白发生了什么事。我严格遵循所有的微软文档,事实上甚至不使用任何我自己的脚本/代码。首先,我按照他们的文档创建Python函数。成功了。https://docs.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-python?tabs=azure-cli、cmd、browser使用命令行工具将Azure功能连接到Azure存储。不可复制。https://docs.microsoft.com/en-us/azure/azure-functions/functions-add-output-binding-storage-queue-cli?pivots=programming-python语言

更令人惊讶的是,他们最终向我展示了与第一篇文章不同的代码。我试了两种版本,都没用。

这些是他们文档中的代码。这是他们的python脚本代码(init.py)

import logging

import azure.functions as func


def main(req: func.HttpRequest, msg: func.Out[func.QueueMessage]) -> str:

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        msg.set(name)
        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
            "Please pass a name on the query string or in the request body",
            status_code=400
        )

这是JSON函数代码:

{
    "scriptFile": "__init__.py",
"bindings": [
  {
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "$return"
  },
  {
    "type": "queue",
    "direction": "out",
    "name": "msg",
    "queueName": "outqueue",
    "connection": "AzureWebJobsStorage"
  }
]
}

因为他们没有发布完整版本的代码,所以我添加了括号之类的东西。如果你想要文档引用,他们是这么说的:

虽然一个函数只能有一个触发器,但它可以有多个输入和输出绑定,这允许您连接到其他Azure服务和资源,而无需编写自定义集成代码。您可以在函数中声明这些绑定。函数文件夹中的json文件。在上一个快速入门中,我们介绍了您的函数。HttpExample文件夹中的json文件在bindings集合中包含两个绑定:

"scriptFile": "__init__.py",
"bindings": [
    {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": [
            "get",
            "post"
        ]
    },
    {
        "type": "http",
        "direction": "out",
        "name": "$return"
    }

每个绑定至少有一个类型、一个方向和一个名称。在上面的示例中,第一个绑定是httpTrigger类型,方向为。对于in方向,name指定触发器调用时发送给函数的输入参数的名称。

集合中的第二个绑定是http类型,其方向为out,在这种情况下,$return的特殊名称表示该绑定使用函数的返回值,而不是提供输入参数。

要从该函数写入Azure存储队列,请添加一个名为msg的out-binding类型的queue,如下代码所示:

"bindings": [
  {
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "$return"
  },
  {
    "type": "queue",
    "direction": "out",
    "name": "msg",
    "queueName": "outqueue",
    "connection": "AzureWebJobsStorage"
  }
]

在本例中,msg作为输出参数提供给函数。对于队列类型,还必须在queueName中指定队列的名称,并在connection中提供Azure存储连接的名称(来自local.settings.json)。

因此,即使这段代码发布在文档中,它似乎也不能正常工作。或者他们的python代码不工作。我不知道。

我试着跟随他们的脚步。我还尝试复制粘贴他们的新版本代码(与原始版本略有不同),但没有任何效果。我仍然收到这个错误(我更改了一些我怀疑敏感的元素)

(.venv) C:\Users\usr\LocalFunctionProj>func start
Found Python version 3.8.5 (py).

Azure Functions Core Tools
Core Tools Version:       3.0.3160 Commit hash: 00aa7f49cc5c5f15241a5e6e5363256f19ceb980
Function Runtime Version: 3.0.14916.0


Functions:

        HttpExample: [GET,POST] http://localhost:8072/api/HttpExample

For detailed output, run func with --verbose flag.
[2020-12-27T08:45:11.912Z] Worker process started and initialized.
[2020-12-27T08:45:12.048Z] Worker failed to function id ebece17c-3077-4f78-bcca-d46565cef86c.
[2020-12-27T08:45:12.050Z] Result: Failure
Exception: FunctionLoadError: cannot load the HttpExample function: the following parameters are declared in Python but not in function.json: {'msg'}
Stack:   File "D:\Program Files\Microsoft\Azure Functions Core Tools\workers\python\3.8\WINDOWS\X64\azure_functions_worker\dispatcher.py", line 272, in _handle__function_load_request
    self._functions.add_function(
  File "D:\Program Files\Microsoft\Azure Functions Core Tools\workers\python\3.8\WINDOWS\X64\azure_functions_worker\functions.py", line 112, in add_function
    raise FunctionLoadError(
.
[2020-12-27T08:45:16.457Z] Host lock lease acquired by instance ID '000000000000000000000000AF616381'.

我真的不明白他们自己的代码是如何不工作的。我只想学习如何将我的python脚本部署到Azure,我没想到这是一个如此大的挑战。

这就是更新功能的方式。json代码如下所示:

共有1个答案

奚才良
2023-03-14

尝试下面,它会工作正常:

主机。json

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  }
}

初始化。py

import logging

import azure.functions as func


def main(req: func.HttpRequest, msg: func.Out[str]) -> func.HttpResponse:
    msg.set("This is test. 1227")
    return func.HttpResponse("This is a test.")

函数。json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureStorageQueuesConnectionString"
    }
  ]
}

local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureStorageQueuesConnectionString":"DefaultEndpointsProtocol=https;AccountName=0730bowmanwindow;AccountKey=xxxxxx==;EndpointSuffix=core.windows.net"
  }
}
 类似资料:
  • 问题内容: 似乎有两种不同的方法可以在Golang中声明函数,如下所示: 以上作品。但是,以下方法不起作用: 它会抱怨: 那么和之间有什么区别? 我发现它的原因可能也是因为我也编写了许多Javascript。在Go中,似乎很少有人看到像这样的函数。在这两个中,我们可以说哪个比另一个更正确吗? 问题答案: 当你做 您正在为该变量分配匿名函数。您也可以这样写: 创建函数的另一种方法是创建一个命名函数:

  • 5.1. 函数声明 函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。 func name(parameter-list) (result-list) { body } 形式参数列表描述了函数的参数名以及参数类型。这些参数作为局部变量,其值由参数调用者提供。返回值列表描述了函数返回值的变量名以及类型。如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的。如

  • 我在自学Python。为什么下面的代码不起作用?我是否必须在使用其他函数之前预先声明它? 代码应该创建一个永无止境的循环。 编辑:为什么这段代码什么也不输出?

  • 2.2. 函数声明 2.2.1. Python 和其他编程语言数据类型的比较 与其它大多数语言一样 Python 有函数, 但是它没有像 C++ 一样的独立的头文件;或者像 Pascal 一样的分离的 interface/implementation 段。 一旦需要函数时, 像下面这样声明即可: def buildConnectionString(params): 首先, 函数声明以关键字 de

  • 每个函数前面应该放置一段块注释,概要描述该函数做什么以及(如果不是很清晰)如何使用该函数。重要的设计决策讨论以及副作用说明也适合放在注释 中。避免提供那些代码本身可以清晰提供的信息。 函数的返回类型应该单独占据一行,(可选的)缩进一个级别。不用使用默认返回类型int;如果函数没有返回值,那么将返回类型声明为void。如 果返回值需要大段详细的说明,可以在函数之前的注释中描述;否则可以在同一行中对返

  • 问题内容: 是否可以在不首先完全定义函数的情况下调用函数?尝试执行此操作时,出现错误:“未定义 function_name ”。我来自C ++背景,因此这个问题使我感到困惑。 在工作之前声明该功能: 但是,尝试在未先定义函数的情况下调用该函数会带来麻烦: 在C ++中,一旦将其标头放在函数后,就可以在调用后声明一个函数。 我在这里想念什么吗? 问题答案: Python中一种惯用的方式是编写: 只要