#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. Это действительно полезно, спасибо за подробный ответ.