Как http, так и запуск таймера в функции Azure

#python #azure #triggers #azure-functions

#python #azure #триггеры #azure-функции

Вопрос:

Я могу иметь как таймер, так и http-триггер в моей функции Azure, дублируя папку проекта. Таким образом, у меня есть отдельный function.json , где я могу указать триггер таймера для одного и триггер http для другого, см. src_http И src_timer ниже:

папки

Это определенно нежелательно, поскольку я дублирую свой код.

Вопрос: Есть ли способ иметь как таймер, так и http-триггер в одной функции?

Я прочитал это, и похоже, что это невозможно, надеюсь, я ошибаюсь.

Ответ №1:

Тогда просто не дублируйте свой код 😉 Переместите общий код, который используется обеими функциями, В общий класс и т. Д., На Который вы ссылаетесь из двух. Эти две функции сами по себе отличаются только своей подписью (и тем, как они вызываются под капотом).

Комментарии:

1. Я попробовал это, поэтому у меня была другая папка с функциональным кодом, назовем это src , затем создал папки src_http и src_timer откуда я импортировал код src . Но мне не удалось заставить это работать, поскольку я не мог импортировать код из другой папки, и эта src папка не развернута в Azure.

2. Я не силен в python tbh, но я знаю, что это обязательно должно работать и не является ограничением функций.

3. Спасибо за ответ, я изучу это и опубликую свои выводы здесь, чтобы другие тоже могли найти это. Просто на всякий случай, значит, вы бы тоже сделали три отдельные папки? src который содержит весь функциональный код проекта. src_http где определена логика http и какой импорт src . Наконец src_timer , то же самое, что и http, но логика таймера.

Ответ №2:

РЕДАКТИРОВАТЬ: Смотрите некоторые официальные документы, доступные сейчас, о структуре папок и поведении импорта.


В java вы можете сделать что-то подобное, потому что он использует class-name.function-name as "scriptFile" в сгенерированном function.json :

     public class EhConsumerFunctions {
        private void processEvent(String request, final ExecutionContext context) {
         // process...
        }

        @FunctionName("HttpTriggerFunc")
        public void httpTriggerFunc(
           @HttpTrigger(name = "req", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.ANONYMOUS)
           HttpRequestMessage<Optional<String>> req,
           final ExecutionContext context) {
           processEvent(req.getBody().get(), context);
       }

       @FunctionName("TimerTriggerFunc")
       public void timerTriggerFunc(
        @TimerTrigger(name = "timerRequest", schedule = "0 */5 * * * *") String timerRequest,
        final ExecutionContext context) {
           processEvent(timerRequest, context);
       }

    }
 

Для python он принимает имя скрипта и ожидает, что оно будет иметь main и отдельно function.json . Таким образом, вам нужно будет иметь две папки и два сценария. Но каждый скрипт может import использовать общий модуль бизнес-логики, который выполняет фактическую обработку.

Что-то вроде:

 MyFunctionApp
|____ host.json
|____ business
|     |____ logic.py
|____ http_trigger
|     |____ __init__.py
|     |____ function.json
|____ timer_trigger
      |____ __init__.py
      |____ function.json
 

http_trigger/__init__.py будет иметь:

 from business import logic

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

и http_trigger/function.json будет иметь:

     {
        "scriptFile": "http_trigger/__init__.py",
        "disabled": false,
        "bindings": [
            {
                "authLevel": "function",
                "type": "httpTrigger",
                "direction": "in",
                "name": "req"
            },
            {
                "type": "http",
                "direction": "out",
                "name": "res"
            }
        ]
    }
 

Комментарии:

1. Это действительно полезно, спасибо за подробный ответ.