Python Azure提供如何在脚本完成之前返回HttpResponse或显示消息的功能

Python Azure提供如何在脚本完成之前返回HttpResponse或显示消息的功能,python,azure,azure-functions,Python,Azure,Azure Functions,我有一个Python Azure函数,它是一个文件和一个主函数: def main(req: func.HttpRequest) -> func.HttpResponse: [bunch of code] return func.HttpResponse("the file will be deleted in 10 minutes", status_code=200) 它在Azure Blob存储中为用户创建一个文件,并在10分钟内将其删除。我用t

我有一个Python Azure函数,它是一个文件和一个主函数:

def main(req: func.HttpRequest) -> func.HttpResponse:
    [bunch of code]

    return func.HttpResponse("the file will be deleted in 10 minutes", status_code=200)
它在Azure Blob存储中为用户创建一个文件,并在10分钟内将其删除。我用time.sleep600来做这件事。但是,该消息仅在该文件已被删除后,才会在此计时器结束时到达

如何使HttpResponse在脚本结束之前显示消息,然后在删除消息之前等待10分钟


我已尝试在time.sleep600之前添加func.HttpResponse“文件将在10分钟内被删除”,但它不返回任何内容。

对于具有类似http输出绑定的函数,您必须在最后返回http响应,响应才能正常工作。因此,单凭一项功能,无法实现这一点。继续阅读替代解决方案

这个问题通常是一个“异步”处理示例,您希望像ok一样立即响应,我将这样做,同时它将进一步处理排队等待在后端继续。要在Azure中实现此功能,您需要以下2个功能:

函数1:为了简单起见,我将使用存储队列。 函数2:将由函数1排队的消息触发。 功能1根据您的需要进行更新: JSON:

代码:

代码:


注意:您还可以查看哪里可以处理复杂的工作流,而不需要自己管理排队。但是,由于本例中的场景非常简单,我没有介绍它。

对于具有http输出绑定的函数,您必须在最后返回http响应,响应才能工作。因此,单凭一项功能,无法实现这一点。继续阅读替代解决方案

这个问题通常是一个“异步”处理示例,您希望像ok一样立即响应,我将这样做,同时它将进一步处理排队等待在后端继续。要在Azure中实现此功能,您需要以下2个功能:

函数1:为了简单起见,我将使用存储队列。 函数2:将由函数1排队的消息触发。 功能1根据您的需要进行更新: JSON:

代码:

代码:


注意:您还可以查看哪里可以处理复杂的工作流,而不需要自己管理排队。但是,由于本例中的场景非常简单,我没有介绍它。

这是因为在函数本身向管道返回某些内容之前,不会发送实际响应-管道随后会将结果返回给调用者

我会创建一条队列消息,将初始不可见性设置为10分钟,添加到例如删除文件队列中,而不是在功能应用程序中等待10分钟,这是你真正不应该做的事情。在某处有一个QueueTrigger,侦听delete file queue,并执行文件的删除

因此,请执行类似这样的操作,因为我对python中的函数不太熟悉,所以请将其视为伪代码:

def mainreq:func.HttpRequest->func.HttpResponse: 处理你必须处理的事情,但不包括时间 队列\u client.send\u messagepath/to/blob,可见性\u超时=600 消息将在队列的后面结束,并且 它将保持不可见600秒 这是我们不必等待的事情,因此,下面 我马上回来 return func.HttpResponsefile将在10分钟内删除 您的QueueTrigger将如下所示:

def main文件名:func.QueueMessage,inputblob:func.InputStream->None: 检查inputblob是否为none,如果不是,则将其删除 在functions.json中,应该包含文件名和inputblob的绑定:

{ 名称:filename, 类型:queueTrigger, 方向:在, queueName:删除文件队列, 连接:MyStorageConnectionString }, { 名称:inputblob, 类型:blob, 路径:{queueTrigger}, 连接:MyStorageConnectionString, 方向:在 } 初始化队列\u客户端。
和更多信息。

这是因为在函数本身向管道返回某些内容之前,不会发送实际响应-然后管道将结果返回给调用者

我会创建一条队列消息,将初始不可见性设置为10分钟,添加到例如删除文件队列中,而不是在功能应用程序中等待10分钟,这是你真正不应该做的事情。在某处有一个QueueTrigger,侦听delete file queue,并执行文件的删除

因此,请执行类似这样的操作,因为我对python中的函数不太熟悉,所以请将其视为伪代码:

def mainreq:func.HttpRequest->func.HttpResponse: 处理你必须处理的事情,但不包括时间 队列\u client.send\u messagepath/to/blob,可见性\u超时=600 消息将在queu的后面结束 e、 及 它将保持不可见600秒 这是我们不必等待的事情,因此,下面 我马上回来 return func.HttpResponsefile将在10分钟内删除 您的QueueTrigger将如下所示:

def main文件名:func.QueueMessage,inputblob:func.InputStream->None: 检查inputblob是否为none,如果不是,则将其删除 在functions.json中,应该包含文件名和inputblob的绑定:

{ 名称:filename, 类型:queueTrigger, 方向:在, queueName:删除文件队列, 连接:MyStorageConnectionString }, { 名称:inputblob, 类型:blob, 路径:{queueTrigger}, 连接:MyStorageConnectionString, 方向:在 } 初始化队列\u客户端。
还有更多信息。

该死,闪电般的快。但至少我们的想法是一样的。该死,闪电般的快。但至少我们的想法是一样的。
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "function",
      "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"
    }
  ]
}
import azure.functions as func

def main(req: func.HttpRequest, msg: func.Out[str]) -> func.HttpResponse:
    [bunch of code]
    input_msg = "<create the message body required by function 2>"
    msg.set(input_msg)
    return func.HttpResponse("the file will be deleted in 10 minutes", status_code=201)
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "msg",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "messages",
      "connection": "AzureStorageQueuesConnectionString"
    }
  ]
}
import json
import azure.functions as func

def main(msg: func.QueueMessage):  
     # below is just an example of parsing the message, in your case it might be taking the blob info required for deleting
     message = json.dumps({
        'id': msg.id,
        'body': msg.get_body().decode('utf-8'),
        'expiration_time': (msg.expiration_time.isoformat()
                            if msg.expiration_time else None),
        'insertion_time': (msg.insertion_time.isoformat()
                           if msg.insertion_time else None),
        'time_next_visible': (msg.time_next_visible.isoformat()
                              if msg.time_next_visible else None),
        'pop_receipt': msg.pop_receipt,
        'dequeue_count': msg.dequeue_count
    })

    [bunch of code]