Возникла ошибка, которая началась после перезагрузки. Я тестирую использование функций Azure в сочетании с FastAPI на основе: https://dev.to/manukanne/azure-functions-and-fastapi-14b6
Код работал, и тестовый вызов API работал должным образом. После перезагрузки компьютера и перезапуска VSCode у меня возникла проблема при попытке запустить локально.
Я работал через SO: 76842742, это немного другая настройка, но наблюдается аналогичный тип ошибки.
Виртуальная среда работает как положено, и файл require.txt установлен. Также выполнялся запуск с многословным флагом, но дополнительных сообщений об ошибках не было.
Текущая ошибка:
Работнику не удалось индексировать функции
Результат: Исключение сбоя: ValueError: Не удалось найти экземпляры приложения-функции верхнего уровня в function_app.py.
В моем function.json есть файл scriptFile: init.py, который, как я думал, должен быть function_app.py, но ошибка указывает на то, что он все равно ищет function_app.py. Я создал копию моего function_app.py и назвал ее «__init __.py» в качестве потенциального исправления, но это привело к тому же коду ошибки.
На данный момент я не понимаю, почему индексная функция не найдена. Есть мысли по поводу потенциального решения?
Найдена версия Python 3.11.0 (py)
Версия основных инструментов: 4.0.5611
Код VS: 1.88.1
function_app.py
import azure.functions as func
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import logging
app = FastAPI()
@app.exception_handler(Exception)
async def handle_exception(request: Request, exc: Exception):
return JSONResponse(
status_code=400,
content = {"message": str(exc)},
)
@app.get("/")
async def home():
return {
"info": "Try the API path for success"
}
@app.get("/v1/test/{test}")
async def get_test(
test: str,):
return {
"test": test,
}
def main(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
return func.AsgiMiddleware(app).handle_async(req, context)
function.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
],
"route": "/{*route}"
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}
ДОПОЛНИТЕЛЬНО
хост.json
{
"$schema": "https://raw.githubusercontent.com/Azure/azure-functions-host/dev/schemas/json/host.json",
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
},
"extensions": {
"http": {
"routePrefix": ""
}
}
}
Вы используете V1 среды выполнения Python, можно ли переключиться на V2? Тогда вы можете просто использовать это в качестве примера: github.com/Azure-Samples/fastapi-on-azure-functions
@JarroVGIT Думаю, я использую V2. Я добавил свой файл host.json в общий вопрос/описание. Что привело вас к мысли, что это работает через версию 1?
Модель Python v1 использует файл function.json для определения функций, а новая модель v2 позволяет вместо этого использовать подход на основе декоратора. У вас также есть основная функция, а не объект app
. См. Learn.microsoft.com/en-us/azure/azure-functions/…
Вот что я вижу в предоставленной ссылке: @app.function_name(name = "HttpTrigger1") @app.route(route = "req") def main(req): user = req.params.get("user" ) return f"Привет, {пользователь}!" И в приведенном выше коде, и в примере определены основные функции, и у меня есть приведенная выше функция приложения для FASTAPI, которая передается в основную функцию azzure через AsgiMiddleWare. Я покопаюсь еще немного, но думаю, что структура надежная.
@JarroVGIT Покопавшись немного, кажется, я вижу проблему, которую вы выявили.
Да, вверху страницы вам нужно выбрать V2 в качестве модели программирования, иначе вы увидите примеры V1.
Основываясь на комментариях JarroVGIT, я реорганизовал код function_app.py следующим образом:
import azure.functions as func
from fastapi import FastAPI, Request, Response
import logging
fast_app = FastAPI()
@fast_app.exception_handler(Exception)
async def handle_exception(request: Request, exc: Exception):
return Response(
status_code=400,
content = {"message": str(exc)},
)
@fast_app.get("/")
async def home():
return {
"info": "Try the API path for success"
}
@fast_app.get("/v1/test/{test}")
async def get_test(
test: str,):
return {
"test": test,
}
app = func.AsgiFunctionApp(app=fast_app,
http_auth_level=func.AuthLevel.ANONYMOUS,)
Удаление основного определения и добавление вызова приложения. Это решило проблему и позволило функции Azure нормально запускаться.
По предложению второго пилота я добавил ссылку на точку входа в файл function.json, чтобы указать на main. Это не изменило вывод ошибки.