Python中的Azure函数,该函数位于时间触发器上,从url获取zip文件,解压缩,然后将文件输出到Azure存储中的blob容器

Python中的Azure函数,该函数位于时间触发器上,从url获取zip文件,解压缩,然后将文件输出到Azure存储中的blob容器,python,azure-functions,Python,Azure Functions,下面是我在function.json中的绑定 { "scriptFile": "__init__.py", "bindings": [ { "name": "mytimer", "type": "timerTrigger", "direction": "in",

下面是我在function.json中的绑定

{
  "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,我已经更新了答案。但核心思想仍然是在声明数据后放置数据。