Работнику не удалось индексировать функции с помощью функций Azure и локального FastAPI с помощью AsgiMiddleware

Возникла ошибка, которая началась после перезагрузки. Я тестирую использование функций 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": ""
    }
  }
}

По предложению второго пилота я добавил ссылку на точку входа в файл function.json, чтобы указать на main. Это не изменило вывод ошибки.

Jabberwockey 02.05.2024 23:30

Вы используете V1 среды выполнения Python, можно ли переключиться на V2? Тогда вы можете просто использовать это в качестве примера: github.com/Azure-Samples/fastapi-on-azure-functions

JarroVGIT 03.05.2024 08:41

@JarroVGIT Думаю, я использую V2. Я добавил свой файл host.json в общий вопрос/описание. Что привело вас к мысли, что это работает через версию 1?

Jabberwockey 04.05.2024 00:20

Модель Python v1 использует файл function.json для определения функций, а новая модель v2 позволяет вместо этого использовать подход на основе декоратора. У вас также есть основная функция, а не объект app. См. Learn.microsoft.com/en-us/azure/azure-functions/…

JarroVGIT 04.05.2024 07:23

Вот что я вижу в предоставленной ссылке: @app.function_name(name = "HttpTrigger1") @app.route(route = "req") def main(req): user = req.params.get("user" ) return f"Привет, {пользователь}!" И в приведенном выше коде, и в примере определены основные функции, и у меня есть приведенная выше функция приложения для FASTAPI, которая передается в основную функцию azzure через AsgiMiddleWare. Я покопаюсь еще немного, но думаю, что структура надежная.

Jabberwockey 06.05.2024 17:38

@JarroVGIT Покопавшись немного, кажется, я вижу проблему, которую вы выявили.

Jabberwockey 06.05.2024 18:21

Да, вверху страницы вам нужно выбрать V2 в качестве модели программирования, иначе вы увидите примеры V1.

JarroVGIT 06.05.2024 18:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
704
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на комментариях 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 нормально запускаться.

Другие вопросы по теме