Python中的Azure函数,该函数位于时间触发器上,从url获取zip文件,解压缩,然后将文件输出到Azure存储中的blob容器
下面是我在function.json中的绑定Python中的Azure函数,该函数位于时间触发器上,从url获取zip文件,解压缩,然后将文件输出到Azure存储中的blob容器,python,azure-functions,Python,Azure Functions,下面是我在function.json中的绑定 { "scriptFile": "__init__.py", "bindings": [ { "name": "mytimer", "type": "timerTrigger", "direction": "in",
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "mytimer",
"type": "timerTrigger",
"direction": "in",
"schedule": "0 30 7 * * *"
},
{
"type": "blob",
"direction": "out",
"name": "outputBlob",
"path": "jarvisetl/nppesraw",
"connection": "AzureWebJobsStorage"
}
]
}
这是我的_init.py
import datetime
import logging
import azure.functions as func
import urllib.request
from io import BytesIO
from urllib.request import urlopen
from zipfile import ZipFile
def main(mytimer: func.TimerRequest) -> str:
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
if mytimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
zipurl = 'https://download.file.com'
with urlopen(zipurl) as zipresp:
with ZipFile(BytesIO(zipresp.read())) as zfile:
zfile.extractall(outputblob)
我最大的问题是我遇到了一个错误,即function.json中声明了“outputblob”,但在python脚本中并不明显。我不确定“outputblob”在Python脚本中真正应该放在哪里。更新:
import datetime
import logging
import azure.functions as func
def main(mytimer: func.TimerRequest,outputblob: func.Out[func.InputStream]) -> None:
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
testdata = 'this is test.'
outputblob.set(testdata)
if mytimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
原始答案:
import datetime
import logging
import azure.functions as func
def main(mytimer: func.TimerRequest,outputblob: func.Out[func.InputStream]) -> None:
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
testdata = 'this is test.'
outputblob.set(testdata)
if mytimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
下面是一个简单的例子:
function.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route": "{test}",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"name": "outputblob",
"type": "blob",
"path": "test1/{test}.txt",
"connection": "str",
"direction": "out"
}
]
}
init.py
import logging
import azure.functions as func
def main(req: func.HttpRequest,outputblob: func.Out[func.InputStream],) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
testdata = 'this is test.'
outputblob.set(testdata)
name = req.params.get('name')
return func.HttpResponse(f"This is output binding test, "+name)
更新:
import datetime
import logging
import azure.functions as func
def main(mytimer: func.TimerRequest,outputblob: func.Out[func.InputStream]) -> None:
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
testdata = 'this is test.'
outputblob.set(testdata)
if mytimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
原始答案:
import datetime
import logging
import azure.functions as func
def main(mytimer: func.TimerRequest,outputblob: func.Out[func.InputStream]) -> None:
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
testdata = 'this is test.'
outputblob.set(testdata)
if mytimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
下面是一个简单的例子:
function.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"route": "{test}",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"name": "outputblob",
"type": "blob",
"path": "test1/{test}.txt",
"connection": "str",
"direction": "out"
}
]
}
init.py
import logging
import azure.functions as func
def main(req: func.HttpRequest,outputblob: func.Out[func.InputStream],) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
testdata = 'this is test.'
outputblob.set(testdata)
name = req.params.get('name')
return func.HttpResponse(f"This is output binding test, "+name)
官方文件没有写,我写了一个简单的例子,你可以看看我的答案。嗨,你测试过我的更新答案吗?我测试过了,但是我在连接字符串中遇到了一个新的错误。该项目已从azure功能中放弃,并通过数据工厂完成。我有一个新问题,它建立在ADF中完成的工作之上。官方文件没有写,我写了一个简单的例子,你可以看看我的答案。嗨,你测试过我的更新答案吗?我测试过了,但是我在连接字符串中遇到了一个新的错误。该项目已从azure功能中放弃,并通过数据工厂完成。我有一个新问题,它建立在ADF中完成的工作之上。我的代码中的无法识别参数。这是一个定时器触发的函数,因此有如下区别well@DimejiOlayinka您只需要首先声明绑定,然后放入数据,就这样了。这与您使用的触发器无关。我以httptrigger为例,希望您能理解这一点。它与触发器的类型无关。好的,既然你说你正在使用timetrigger,我已经更新了答案。但核心思想仍然是在声明data.params后放入数据。在我的代码中,params不被识别。这是一个定时器触发的函数,因此有如下区别well@DimejiOlayinka您只需要首先声明绑定,然后放入数据,就这样了。这与您使用的触发器无关。我以httptrigger为例,希望您能理解这一点。它与触发器的类型无关。好的,既然你说你正在使用timetrigger,我已经更新了答案。但核心思想仍然是在声明数据后放置数据。