HttpTrigger 使用python依次执行

Posted

技术标签:

【中文标题】HttpTrigger 使用python依次执行【英文标题】:HttpTrigger Execute one after another using python 【发布时间】:2019-11-30 06:46:56 【问题描述】:

我使用 python 创建了一个 HttpTrigger Azure 函数。但我想在同一个项目中使用 python 创建另一个 HttpTrigger Azure Functions。在这个应用程序中,我想在执行第二个 HttpTrigger Azure 函数之后执行第一个 HttpTrigger Azure 函数。我该如何实现?

因为在 Python Azure Functions 中没有 Durable Functions。这就是为什么我无法理解如何在另一个 azure 函数执行后执行。

【问题讨论】:

只需从您的第一个函数调用第二个函数的公共 URL (https://<functionapp>.azurewebsites.net/api/<function>)。您可以将第二个函数转换为在队列上触发并从您的第一个 HttpTrigger 函数输出队列消息。但除非您绝对需要,否则这只是无端的复杂性。 @evilSnobu 感谢您的回复。我会检查并更新你 【参考方案1】:

假设有两个HttpTrigger函数HttpTriggerAHttpTriggerB,我想到的直接解决方案是使用requests通过HTTP客户端请求从HttpTriggerB函数请求HttpTriggerA的公共url,作为下面是我第一个版本的HttpTriggerB 代码中的代码。

import logging

import azure.functions as func
import requests
from urllib.parse import urlparse

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name') or 'Peter Pan'
    codeA = req.params.get('codeA') or ''
    o = urlparse(req.url)
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        print("B be invoked.")
        resp = requests.get(f"o.scheme://o.netloc/api/HttpTriggerA?name=name&code=codeA")
        return func.HttpResponse(f"Hello name! from B resp.status_code == 200 and resp.text or ''")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )

但是,在我在本地或 Azure 上测试上述代码后,它将无法正常工作。当我访问 url http(s)://<the host of local or Azure>:<7071 or 80>/api/HttpTriggerB?name=Peter%20Pan&code=<code for HttpTriggerB>&codeA=<code for HttpTriggerA> 时,它将挂在代码行 resp = requests.get(f"o.scheme://o.netloc/api/HttpTriggerA?name=name&code=codeA")。挂起问题的原因似乎是由单例或单线程中运行的函数引起的。

所以我切换到另一个解决方案,使用来自HttpTriggerBhtml 内容的Ajax 请求。如下图所示。

这是我的HttpTriggerB函数代码,HttpTriggerA函数只是由func new生成的。

import logging

import azure.functions as func
#import requests
from urllib.parse import urlparse

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name') or 'Peter Pan'
    codeA = req.params.get('codeA') or ''
    o = urlparse(req.url)
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        print("B be invoked.")
        #resp = requests.get(f"o.scheme://o.netloc/api/httptriggera?name=name&code=req.params.get('codeA')")
        html = """
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>

Hello """+name+"""! from B<br/>
<span id="A"></span>

<script>
$.when( 
  $.get('"""+o.scheme+'://'+o.netloc+'/api/HttpTriggerA?name='+name+'&code='+codeA+"""'),
  $.ready
).done(function( data ) 
  $( "#A" ).html( data[0] );
);
</script>
"""
        return func.HttpResponse(html, mimetype="text/html")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )

希望对你有帮助。

【讨论】:

以上是关于HttpTrigger 使用python依次执行的主要内容,如果未能解决你的问题,请参考以下文章

将值从 Azure 逻辑应用程序传递到 HttpTrigger Azure 函数

如何将 Azure Httptrigger 连接到网站?

Azure:无法从 Azure 函数 HttpTrigger 读取 Blob 文本(400 - 错误请求错误)

python实现获取身份证号码的方法

python列表中依次插入不同元素

广度优先bfs的python实现