Справочник разработчика Python. Функции AzureAzure Functions Python developer guide

В этой статье содержатся общие сведения о разработке Функций Azure с помощью Python.This article is an introduction to developing Azure Functions using Python. Предполагается, что вы уже прочли руководство для разработчиков Функций Azure.The content below assumes that you've already read the Azure Functions developers guide.

Примеры проектов автономной функции в Python см. в статье образцы функций Python.For standalone Function sample projects in Python, see the Python Functions samples.

Модель программированияProgramming model

Функции Azure предполагают, что функция не имеет состояния, в скрипте Python, который обрабатывает входные данные и выдает выходные данные.Azure Functions expects a function to be a stateless method in your Python script that processes input and produces output. По умолчанию среда выполнения ждет, что метод будет реализован как глобальный метод, именуемый main() в __init__.pyном файле.By default, the runtime expects the method to be implemented as a global method called main() in the __init__.py file. Можно также указать альтернативную точку входа.You can also specify an alternate entry point.

Данные из триггеров и привязок привязываются к функции через атрибуты метода с помощью свойства name, определенного в файле Function. JSON .Data from triggers and bindings is bound to the function via method attributes using the name property defined in the function.json file. Например, приведенная ниже функция Function. JSON описывает простую функцию, АКТИВИРУЕМУЮ HTTP-запросом с именем req:For example, the function.json below describes a simple function triggered by an HTTP request named req:

{
  "bindings": [
    {
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "authLevel": "anonymous"
    },
    {
      "name": "$return",
      "direction": "out",
      "type": "http"
    }
  ]
}

Файл __init__.py содержит следующий код функции:The __init__.py file contains the following function code:

def main(req):
    user = req.params.get('user')
    return f'Hello, {user}!'

Кроме того, можно явно объявить типы атрибутов и тип возвращаемого значения в функции с помощью аннотаций типа Python.you can also explicitly declare the attribute types and return type in the function using Python type annotations. Это помогает использовать функции IntelliSense и автозаполнения, предоставляемые многими редакторами кода Python.This helps you use the intellisense and autocomplete features provided by many Python code editors.

import azure.functions


def main(req: azure.functions.HttpRequest) -> str:
    user = req.params.get('user')
    return f'Hello, {user}!'

Аннотации Python, включенные в пакет azure.functions.*, позволяют привязать входные и выходные данные к методам.Use the Python annotations included in the azure.functions.* package to bind input and outputs to your methods.

Альтернативная точка входаAlternate entry point

Можно изменить поведение функции по умолчанию, при необходимости указав свойства scriptFile и entryPoint в файле Function. JSON .You can change the default behavior of a function by optionally specifying the scriptFile and entryPoint properties in the function.json file. Например, приведенный ниже файл Function. JSON сообщает среде выполнения о необходимости использовать метод customentry() в файле Main.py в качестве точки входа для функции Azure.For example, the function.json below tells the runtime to use the customentry() method in the main.py file, as the entry point for your Azure Function.

{
  "scriptFile": "main.py",
  "entryPoint": "customentry",
  "bindings": [
      ...
  ]
}

Структура папокFolder structure

Рекомендуемая структура папок для проекта функций Python выглядит как в следующем примере:The recommended folder structure for a Python Functions project looks like the following example:

 __app__
 | - MyFirstFunction
 | | - __init__.py
 | | - function.json
 | | - example.py
 | - MySecondFunction
 | | - __init__.py
 | | - function.json
 | - SharedCode
 | | - myFirstHelperFunction.py
 | | - mySecondHelperFunction.py
 | - host.json
 | - requirements.txt
 tests

Главная папка проекта (__приложение__) может содержать следующие файлы:The main project folder (__app__) can contain the following files:

  • Local. Settings. JSON: используется для хранения параметров приложения и строк подключения при локальном запуске.local.settings.json: Used to store app settings and connection strings when running locally. Этот файл не публикуется в Azure.This file doesn't get published to Azure. Дополнительные сведения см. в разделе Local. Settings. File.To learn more, see local.settings.file.
  • требования. txt: содержит список пакетов, устанавливаемых системой при публикации в Azure.requirements.txt: Contains the list of packages the system installs when publishing to Azure.
  • Host. JSON: содержит глобальные параметры конфигурации, влияющие на все функции в приложении-функции.host.json: Contains global configuration options that affect all functions in a function app. Этот файл не публикуется в Azure.This file does get published to Azure. При локальном запуске поддерживаются не все параметры.Not all options are supported when running locally. Дополнительные сведения см. в разделе Host. JSON.To learn more, see host.json.
  • . фунЦигноре(необязательный). объявляет файлы, которые не должны публиковаться в Azure..funcignore: (Optional) declares files that shouldn't get published to Azure.
  • . gitignore: (необязательный) объявляет файлы, исключаемые из репозитория Git, например Local. Settings. JSON..gitignore: (Optional) declares files that are excluded from a git repo, such as local.settings.json.

У каждой функции есть собственный файл кода и файл конфигурации привязки.Each function has its own code file and binding configuration file (function.json).

Общий код должен храниться в отдельной папке в __приложении__.Shared code should be kept in a separate folder in __app__. Для ссылок на модули в папке SharedCode можно использовать следующий синтаксис:To reference modules in the SharedCode folder, you can use the following syntax:

from __app__.SharedCode import myFirstHelperFunction

Для ссылки на модули, локальные для функции, можно использовать синтаксис относительного импорта следующим образом:To reference modules local to a function, you can use the relative import syntax as follows:

from . import example

При развертывании проекта в приложении-функции в Azure весь контент папки FunctionApp должен быть добавлен в пакет, но не в саму папку.When deploying your project to a function app in Azure, the entire content of the FunctionApp folder should be included in the package, but not the folder itself. Рекомендуется хранить тесты в папке, отдельной от папки проекта, в этом примере tests.We recommend that you maintain your tests in a folder separate from the project folder, in this example tests. Это позволяет не развертывать тестовый код в приложении.This keeps you from deploying test code with your app. Дополнительные сведения см. в разделе модульное тестирование.For more information, see Unit Testing.

Триггеры и входные данныеTriggers and Inputs

Входные данные в Функциях Azure делятся на две категории: входные данные триггеров и дополнительные входные данные.Inputs are divided into two categories in Azure Functions: trigger input and additional input. Несмотря на то что они отличаются в файле function.json, использование идентично в коде Python.Although they are different in the function.json file, usage is identical in Python code. Строки подключения или секреты для триггеров и источников входных данных сопоставляются со значениями в файле local.settings.json при выполнении в локальной среде, а параметры приложения — при запуске в Azure.Connection strings or secrets for trigger and input sources map to values in the local.settings.json file when running locally, and the application settings when running in Azure.

Например, следующий код демонстрирует разницу между двумя:For example, the following code demonstrates the difference between the two:

// function.json
{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "authLevel": "anonymous",
      "route": "items/{id}"
    },
    {
      "name": "obj",
      "direction": "in",
      "type": "blob",
      "path": "samples/{id}",
      "connection": "AzureWebJobsStorage"
    }
  ]
}
// local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "AzureWebJobsStorage": "<azure-storage-connection-string>"
  }
}
# __init__.py
import azure.functions as func
import logging


def main(req: func.HttpRequest,
         obj: func.InputStream):

    logging.info(f'Python HTTP triggered function processed: {obj.read()}')

При активации этой функции HTTP-запрос передается в функцию с помощью req.When the function is invoked, the HTTP request is passed to the function as req. Запись будет извлечена из хранилища больших двоичных объектов Azure на основе идентификатора в URL-адресе маршрута и стала доступна как obj в теле функции.An entry will be retrieved from the Azure Blob Storage based on the ID in the route URL and made available as obj in the function body. Здесь указанная учетная запись хранения является строкой подключения в параметре приложения AzureWebJobsStorage, которая является той же учетной записью хранения, используемой приложением-функцией.Here, the storage account specified is the connection string found in the AzureWebJobsStorage app setting, which is the same storage account used by the function app.

Выходные данныеOutputs

Выходные данные можно выразить как возвращаемое значение или параметры вывода.Output can be expressed both in return value and output parameters. Если используется только один вывод, мы рекомендуем использовать возвращаемое значение.If there's only one output, we recommend using the return value. Для нескольких выводов нужно использовать параметры вывода.For multiple outputs, you'll have to use output parameters.

Чтобы использовать возвращаемое значение функции в качестве значения выходной привязки, присвойте свойству name значение $return в function.json.To use the return value of a function as the value of an output binding, the name property of the binding should be set to $return in function.json.

Чтобы создать несколько выходов, используйте метод set(), предоставляемый интерфейсом azure.functions.Out , чтобы присвоить значение привязке.To produce multiple outputs, use the set() method provided by the azure.functions.Out interface to assign a value to the binding. Например, следующая функция может направлять сообщение в очередь и возвращает ответ HTTP.For example, the following function can push a message to a queue and also return an HTTP response.

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "req",
      "direction": "in",
      "type": "httpTrigger",
      "authLevel": "anonymous"
    },
    {
      "name": "msg",
      "direction": "out",
      "type": "queue",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    },
    {
      "name": "$return",
      "direction": "out",
      "type": "http"
    }
  ]
}
import azure.functions as func


def main(req: func.HttpRequest,
         msg: func.Out[func.QueueMessage]) -> str:

    message = req.params.get('body')
    msg.set(message)
    return message

Ведение журналаLogging

Доступ к средству ведения журнала среды выполнения Функций Azure предоставляется через корневой обработчик logging в приложении-функции.Access to the Azure Functions runtime logger is available via a root logging handler in your function app. Это средство ведения журнала привязано к Application Insights и позволяет отмечать предупреждения и ошибки, возникшие во время выполнения функции.This logger is tied to Application Insights and allows you to flag warnings and errors encountered during the function execution.

Следующий пример сохраняет в журнал информационное сообщение, когда функция вызывается с помощью триггера HTTP.The following example logs an info message when the function is invoked via an HTTP trigger.

import logging


def main(req):
    logging.info('Python HTTP trigger function processed a request.')

Доступны и другие методы ведения журнала, которые позволяют выводить сообщения в консоль на разных уровнях трассировки.Additional logging methods are available that let you write to the console at different trace levels:

МетодMethod DescriptionDescription
critical(_message_) Записывает сообщение с уровнем CRITICAL в корневое средство ведения журнала.Writes a message with level CRITICAL on the root logger.
error(_message_) Записывает сообщение с уровнем ERROR в корневое средство ведения журнала.Writes a message with level ERROR on the root logger.
warning(_message_) Записывает сообщение с уровнем WARNING в корневое средство ведения журнала.Writes a message with level WARNING on the root logger.
info(_message_) Записывает сообщение с уровнем INFO в корневое средство ведения журнала.Writes a message with level INFO on the root logger.
debug(_message_) Записывает сообщение с уровнем DEBUG в корневое средство ведения журнала.Writes a message with level DEBUG on the root logger.

Дополнительные сведения о ведении журналов см. в статье мониторинг функций Azure.To learn more about logging, see Monitor Azure Functions.

Триггеры и привязки HTTPHTTP Trigger and bindings

Триггер HTTP определяется в файле Function. Jon.The HTTP trigger is defined in the function.jon file. name привязки должен соответствовать именованному параметру в функции.The name of the binding must match the named parameter in the function. В предыдущих примерах используется имя привязки req.In the previous examples, a binding name req is used. Этот параметр является объектом HttpRequest , и возвращается объект HttpResponse .This parameter is an HttpRequest object, and an HttpResponse object is returned.

Из объекта HttpRequest можно получить заголовки запроса, параметры запроса, параметры маршрута и текст сообщения.From the HttpRequest object, you can get request headers, query parameters, route parameters, and the message body.

Ниже приведен пример из шаблона триггера HTTP для Python.The following example is from the HTTP trigger template for Python.

def main(req: func.HttpRequest) -> func.HttpResponse:
    headers = {"my-http-header": "some-value"}

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')
            
    if name:
        return func.HttpResponse(f"Hello {name}!", headers=headers)
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             headers=headers, status_code=400
        )

В этой функции значение параметра запроса name получено из параметра params объекта HttpRequest .In this function, the value of the name query parameter is obtained from the params parameter of the HttpRequest object. Текст сообщения в кодировке JSON считывается с помощью метода get_json.The JSON-encoded message body is read using the get_json method.

Аналогичным образом можно задать status_code и headers для ответного сообщения в возвращенном объекте HttpResponse .Likewise, you can set the status_code and headers for the response message in the returned HttpResponse object.

Масштабирование и параллелизмScaling and concurrency

По умолчанию функции Azure автоматически отслеживают нагрузку на приложение и при необходимости создают дополнительные экземпляры узлов для Python.By default, Azure Functions automatically monitors the load on your application and creates additional host instances for Python as needed. Функции используют встроенные пороговые значения (не настраиваемые пользователем) для различных типов триггеров, чтобы решить, когда следует добавлять экземпляры, например возраст сообщений и размер очереди для QueueTrigger.Functions uses built-in (not user configurable) thresholds for different trigger types to decide when to add instances, such as the age of messages and queue size for QueueTrigger. Дополнительные сведения см. в статье как работают планы потребления и Premium.For more information, see How the Consumption and Premium plans work.

Такое поведение масштабирования достаточно для многих приложений.This scaling behavior is sufficient for many applications. Однако приложения со следующими характеристиками могут масштабироваться не так эффективно:Applications with any of the following characteristics, however, may not scale as effectively:

  • Приложение должно выполнять много одновременных вызовов.The application needs to handle many concurrent invocations.
  • Приложение обрабатывает большое количество событий ввода-вывода.The application processes a large number of I/O events.
  • Приложение привязано к вводу-выводу.The application is I/O bound.

В таких случаях можно повысить производительность, применяя асинхронные шаблоны и используя несколько языковых рабочих процессов.In such cases, you can improve performance further by employing async patterns and by using multiple language worker processes.

Асинхронный режимAsync

Поскольку Python является однопотоковым временем выполнения, экземпляр узла для Python может одновременно обрабатывать только один вызов функции.Because Python is a single-threaded runtime, a host instance for Python can process only one function invocation at a time. Для приложений, обрабатывающих большое количество событий ввода-вывода и/или связанных с вводом-выводом, можно повысить производительность, выполняя функции асинхронно.For applications that process a large number of I/O events and/or is I/O bound, you can improve performance by running functions asynchronously.

Чтобы асинхронно запустить функцию, используйте инструкцию async def, которая запускает функцию непосредственно с помощью асинЦио :To run a function asynchronously, use the async def statement, which runs the function with asyncio directly:

async def main():
    await some_nonblocking_socket_io_op()

Функция без ключевого слова async выполняется автоматически в пуле потоков асинЦио:A function without the async keyword is run automatically in an asyncio thread-pool:

# Runs in an asyncio thread-pool

def main():
    some_blocking_socket_io()

Использование нескольких языковых рабочих процессовUse multiple language worker processes

По умолчанию каждый экземпляр узла функций имеет один рабочий процесс с одним языком.By default, every Functions host instance has a single language worker process. Можно увеличить количество рабочих процессов на узел (до 10) с помощью параметра приложения FUNCTIONS_WORKER_PROCESS_COUNT .You can increase the number of worker processes per host (up to 10) by using the FUNCTIONS_WORKER_PROCESS_COUNT application setting. Затем функции Azure пытаются равномерно распределять одновременно вызовы функций между этими рабочими процессами.Azure Functions then tries to evenly distribute simultaneous function invocations across these workers.

FUNCTIONS_WORKER_PROCESS_COUNT применяется к каждому узлу, создаваемому функциями при масштабировании приложения для удовлетворения спроса.The FUNCTIONS_WORKER_PROCESS_COUNT applies to each host that Functions creates when scaling out your application to meet demand.

КонтекстContext

Чтобы получить контекст вызова функции во время выполнения, включите в сигнатуру аргумент context .To get the invocation context of a function during execution, include the context argument in its signature.

Пример.For example:

import azure.functions


def main(req: azure.functions.HttpRequest,
         context: azure.functions.Context) -> str:
    return f'{context.invocation_id}'

Класс контекста имеет следующие строковые атрибуты:The Context class has the following string attributes:

function_directory
Каталог, в котором выполняется функция.The directory in which the function is running.

function_name
Имя функции.Name of the function.

invocation_id
Идентификатор текущего вызова функции.ID of the current function invocation.

Глобальные переменныеGlobal variables

Не гарантируется, что состояние приложения будет сохранено для будущих выполнений.It is not guaranteed that the state of your app will be preserved for future executions. Однако среда выполнения функций Azure часто использует один и тот же процесс для нескольких выполнений одного и того же приложения.However, the Azure Functions runtime often reuses the same process for multiple executions of the same app. Чтобы кэшировать результаты ресурсоемких вычислений, объявите ее как глобальную переменную.In order to cache the results of an expensive computation, declare it as a global variable.

CACHED_DATA = None


def main(req):
    global CACHED_DATA
    if CACHED_DATA is None:
        CACHED_DATA = load_json()

    # ... use CACHED_DATA in code

Переменные средыEnvironment variables

В функциях Параметры приложения, такие как строки подключения службы, предоставляются как переменные среды во время выполнения.In Functions, application settings, such as service connection strings, are exposed as environment variables during execution. Доступ к этим параметрам можно получить, объявляя import os а затем используя setting = os.environ["setting-name"].You can access these settings by declaring import os and then using, setting = os.environ["setting-name"].

В следующем примере возвращается параметр приложенияс ключом с именем myAppSetting:The following example gets the application setting, with the key named myAppSetting:

import logging
import os
import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:

    # Get the setting named 'myAppSetting'
    my_app_setting_value = os.environ["myAppSetting"]
    logging.info(f'My app setting value:{my_app_setting_value}')

Для локальной разработки параметры приложения хранятся в файле Local. Settings. JSON.For local development, application settings are maintained in the local.settings.json file.

Версия PythonPython version

В настоящее время функции Azure поддерживают как Python 3.6. x, так и 3.7. x (официальное распространение CPython).Currently, Azure Functions supports both Python 3.6.x and 3.7.x (official CPython distributions). При локальном запуске среда выполнения использует доступную версию Python.When running locally, the runtime uses the available Python version. Чтобы запросить конкретную версию Python при создании приложения-функции в Azure, используйте параметр --runtime-version команды az functionapp create .To request a specific Python version when you create your function app in Azure, use the --runtime-version option of the az functionapp create command. Изменение версии разрешено только при создании приложение-функция.Version change is allowed only on Function App creation.

Управление пакетамиPackage management

При локальной разработке с помощью Azure Functions Core Tools или Visual Studio Code добавьте имена и версии требуемых пакетов в файл requirements.txt и установите их с помощью pip.When developing locally using the Azure Functions Core Tools or Visual Studio Code, add the names and versions of the required packages to the requirements.txt file and install them using pip.

Например, представленные ниже файл требований и команда pip позволяют установить пакет requests из PyPI.For example, the following requirements file and pip command can be used to install the requests package from PyPI.

requests==2.19.1
pip install -r requirements.txt

Публикация в AzurePublishing to Azure

Когда все будет готово к публикации, убедитесь, что все общедоступные зависимости перечислены в файле требований. txt, который находится в корне каталога проекта.When you're ready to publish, make sure that all your publicly available dependencies are listed in the requirements.txt file, which is located at the root of your project directory.

Файлы проекта и папки, исключаемые из публикации, включая папку виртуальной среды, перечислены в файле. фунЦигноре.Project files and folders that are excluded from publishing, including the virtual environment folder, are listed in the .funcignore file.

Для публикации проекта Python в Azure поддерживаются три действия сборки:There are three build actions supported for publishing your Python project to Azure:

  • Удаленная сборка: зависимости получаются удаленно на основе содержимого файла требований. txt.Remote build: Dependencies are obtained remotely based on the contents of the requirements.txt file. В качестве рекомендуемого метода сборки рекомендуется использовать удаленную сборку .Remote build is the recommended build method. Remote также является вариантом сборки средств Azure по умолчанию.Remote is also the default build option of Azure tooling.
  • Локальная сборка. зависимости получаются локально на основе содержимого файла требований. txt.Local build: Dependencies are obtained locally based on the contents of the requirements.txt file.
  • Пользовательские зависимости. в проекте используются пакеты, не являющиеся общедоступными для наших средств.Custom dependencies: Your project uses packages not publicly available to our tools. (Требуется DOCKER.)(Requires Docker.)

Чтобы собрать зависимости и опубликовать их с помощью системы непрерывной поставки (CD), используйте Azure pipelines.To build your dependencies and publish using a continuous delivery (CD) system, use Azure Pipelines.

Удаленная сборкаRemote build

По умолчанию Azure Functions Core Tools запрашивает удаленную сборку, если вы используете следующую команду Func Azure functionapp Publish для публикации проекта Python в Azure.By default, the Azure Functions Core Tools requests a remote build when you use the following func azure functionapp publish command to publish your Python project to Azure.

func azure functionapp publish <APP_NAME>

Не забудьте заменить <APP_NAME> именем приложения-функции, размещенного в Azure.Remember to replace <APP_NAME> with the name of your function app in Azure.

Расширение "функции Azure" для Visual Studio Code также запрашивает удаленную сборку по умолчанию.The Azure Functions Extension for Visual Studio Code also requests a remote build by default.

Локальная сборкаLocal build

Вы можете запретить удаленную сборку, используя следующую команду Func Azure functionapp Publish для публикации с локальной сборкой.You can prevent doing a remote build by using the following func azure functionapp publish command to publish with a local build.

func azure functionapp publish <APP_NAME> --build local

Не забудьте заменить <APP_NAME> именем приложения-функции, размещенного в Azure.Remember to replace <APP_NAME> with the name of your function app in Azure.

С помощью параметра --build local зависимости проекта считываются из файла требований. txt, и эти зависимые пакеты загружаются и устанавливаются локально.Using the --build local option, project dependencies are read from the requirements.txt file and those dependent packages are downloaded and installed locally. Файлы проекта и зависимости развертываются с локального компьютера в Azure.Project files and dependencies are deployed from your local computer to Azure. Это приводит к увеличению пакета развертывания, отправляемого в Azure.This results in a larger deployment package being uploaded to Azure. Если по какой бы причине зависимости в файле требований. txt не удается получить с помощью основных средств, для публикации необходимо использовать параметр пользовательские зависимости.If for some reason, dependencies in your requirements.txt file can't be acquired by Core Tools, you must use the custom dependencies option for publishing.

Пользовательские зависимостиCustom dependencies

Если в проекте используются пакеты, которые не являются общедоступными для наших средств, их можно сделать доступными для приложения, поместив их в каталог __приложение__/. python_packages.If your project uses packages not publicly available to our tools, you can make them available to your app by putting them in the __app__/.python_packages directory. Перед публикацией выполните следующую команду, чтобы установить зависимости локально:Before publishing, run the following command to install the dependencies locally:

pip install  --target="<PROJECT_DIR>/.python_packages/lib/site-packages"  -r requirements.txt

При использовании пользовательских зависимостей следует использовать параметр публикации --no-build, так как вы уже установили зависимости.When using custom dependencies, you should use the --no-build publishing option, since you have already installed the dependencies.

func azure functionapp publish <APP_NAME> --no-build

Не забудьте заменить <APP_NAME> именем приложения-функции, размещенного в Azure.Remember to replace <APP_NAME> with the name of your function app in Azure.

Модульное тестированиеUnit Testing

Функции, написанные на языке Python, можно тестировать так же, как и другой код Python, используя стандартные платформы тестирования.Functions written in Python can be tested like other Python code using standard testing frameworks. Для большинства привязок можно создать макетный объект ввода, создав экземпляр соответствующего класса из пакета azure.functions.For most bindings, it's possible to create a mock input object by creating an instance of an appropriate class from the azure.functions package. Так как пакет azure.functions недоступен сразу, обязательно установите его с помощью файла requirements.txt, как описано в разделе Управление пакетами выше.Since the azure.functions package is not immediately available, be sure to install it via your requirements.txt file as described in the package management section above.

Например, ниже приведено фиктивное тестирование функции, активируемой HTTP:For example, following is a mock test of an HTTP triggered function:

{
  "scriptFile": "__init__.py",
  "entryPoint": "my_function",
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}
# __app__/HttpTrigger/__init__.py
import azure.functions as func
import logging

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

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        return func.HttpResponse(f"Hello {name}")
    else:
        return func.HttpResponse(
             "Please pass a name on the query string or in the request body",
             status_code=400
        )
# tests/test_httptrigger.py
import unittest

import azure.functions as func
from __app__.HttpTrigger import my_function

class TestFunction(unittest.TestCase):
    def test_my_function(self):
        # Construct a mock HTTP request.
        req = func.HttpRequest(
            method='GET',
            body=None,
            url='/api/HttpTrigger',
            params={'name': 'Test'})

        # Call the function.
        resp = my_function(req)

        # Check the output.
        self.assertEqual(
            resp.get_body(),
            b'Hello Test',
        )

Вот еще один пример с функцией, активируемой в очереди:Here is another example, with a queue triggered function:

{
  "scriptFile": "__init__.py",
  "entryPoint": "my_function",
  "bindings": [
    {
      "name": "msg",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "python-queue-items",
      "connection": "AzureWebJobsStorage"
    }
  ]
}
# __app__/QueueTrigger/__init__.py
import azure.functions as func

def my_function(msg: func.QueueMessage) -> str:
    return f'msg body: {msg.get_body().decode()}'
# tests/test_queuetrigger.py
import unittest

import azure.functions as func
from __app__.QueueTrigger import my_function

class TestFunction(unittest.TestCase):
    def test_my_function(self):
        # Construct a mock Queue message.
        req = func.QueueMessage(
            body=b'test')

        # Call the function.
        resp = my_function(req)

        # Check the output.
        self.assertEqual(
            resp,
            'msg body: test',
        )

"Временные файлы"Temporary files

Метод tempfile.gettempdir() возвращает временную папку, которая /tmpв Linux.The tempfile.gettempdir() method returns a temporary folder, which on Linux is /tmp. Приложение может использовать этот каталог для хранения временных файлов, создаваемых и используемых вашими функциями во время выполнения.Your application can use this directory to store temporary files generated and used by your functions during execution.

Важно!

Файлы, записанные во временный каталог, не всегда сохраняются между вызовами.Files written to the temporary directory aren't guaranteed to persist across invocations. Во время масштабирования временные файлы не являются общими для экземпляров.During scale out, temporary files aren't shared between instances.

Следующий пример создает именованный временный файл во временном каталоге (/tmp):The following example creates a named temporary file in the temporary directory (/tmp):

import logging
import azure.functions as func
import tempfile
from os import listdir

#---
   tempFilePath = tempfile.gettempdir()   
   fp = tempfile.NamedTemporaryFile()     
   fp.write(b'Hello world!')              
   filesDirListInTemp = listdir(tempFilePath)     

Рекомендуется хранить тесты в папке отдельно от папки проекта.We recommend that you maintain your tests in a folder separate from the project folder. Это позволяет не развертывать тестовый код в приложении.This keeps you from deploying test code with your app.

Известные проблемы и часто задаваемые вопросыKnown issues and FAQ

Все известные проблемы и запросы возможностей отслеживаются в списке проблем на GitHub.All known issues and feature requests are tracked using GitHub issues list. Если вы столкнулись с проблемой и не можете найти ее решение на GitHub, откройте новую проблему и укажите ее подробное описание.If you run into a problem and can't find the issue in GitHub, open a new issue and include a detailed description of the problem.

Предоставление общего доступа к ресурсам независимо от источникаCross-origin resource sharing

Функции Azure поддерживают общий доступ к ресурсам между источниками (CORS).Azure Functions supports cross-origin resource sharing (CORS). CORS настраивается на портале и с помощью Azure CLI.CORS is configured in the portal and through the Azure CLI. Список разрешенных источников CORS применяется на уровне приложения функции.The CORS allowed origins list applies at the function app level. При включении CORS ответы включают заголовок Access-Control-Allow-Origin.With CORS enabled, responses include the Access-Control-Allow-Origin header. Дополнительные сведения см. в разделе Общий доступ к ресурсам независимо от источника.For more information, see Cross-origin resource sharing.

Список разрешенных источников сейчас не поддерживается для приложений функций Python.The allowed origins list isn't currently supported for Python function apps. Из-за этого ограничения необходимо явно задать заголовок Access-Control-Allow-Origin в функциях HTTP, как показано в следующем примере:Because of this limitation, you must expressly set the Access-Control-Allow-Origin header in your HTTP functions, as shown in the following example:

def main(req: func.HttpRequest) -> func.HttpResponse:

    # Define the allow origin headers.
    headers = {"Access-Control-Allow-Origin": "https://contoso.com"}

    # Set the headers in the response.
    return func.HttpResponse(
            f"Allowed origin '{headers}'.",
            headers=headers, status_code=200
    )

Убедитесь, что вы также обновляете функцию Function. JSON для поддержки метода HTTP OPTIONS:Make sure that you also update your function.json to support the OPTIONS HTTP method:

    ...
      "methods": [
        "get",
        "post",
        "options"
      ]
    ...

Этот метод HTTP используется веб-браузерами для согласования списка разрешенных источников.This HTTP method is used by web browsers to negotiate the allowed origins list.

Дальнейшие действияNext steps

Для получения дополнительных сведений см. следующие ресурсы:For more information, see the following resources: