我已经使用python创建了一个HttpTrigger Azure函数。但是我想在同一项目中使用python创建另一个HttpTrigger Azure Functions。在此应用程序中,我要在执行第二个HttpTrigger Azure函数之后执行第一个HttpTrigger Azure函数。我该如何实施?
因为在Python Azure Functions中没有持久函数。这就是为什么我不明白如何在另一个Azure函数执行之后执行一个的原因。
答案 0 :(得分:0)
假设有两个HttpTrigger函数HttpTriggerA
和HttpTriggerB
,在我看来,直接解决方案是通过HTTP客户端从HttpTriggerA
函数请求HttpTriggerB
的公共URL我的第一版requests
代码中使用以下代码作为请求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上测试以上代码后,它将无法正常工作。当我访问网址resp = requests.get(f"{o.scheme}://{o.netloc}/api/HttpTriggerA?name={name}&code={codeA}")
时,它将挂在代码行http(s)://<the host of local or Azure>:<7071 or 80>/api/HttpTriggerB?name=Peter%20Pan&code=<code for HttpTriggerB>&codeA=<code for HttpTriggerA>
上。挂起问题的原因似乎是由在单例或单线程中运行的函数引起的。
因此,我切换到另一种解决方案,以使用HttpTriggerB
的html内容中的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
)
希望有帮助。