Python Azure提供如何在脚本完成之前返回HttpResponse或显示消息的功能
我有一个Python Azure函数,它是一个文件和一个主函数: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
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]