Запуск Python приложения в качестве Azure веб-приложения - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь запустить BOT Microsoft Teams в виде Azure веб-приложения - полный код можно найти здесь

application.py:

# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.

import sys
import traceback
from datetime import datetime

from aiohttp import web
from aiohttp.abc import HTTPException
from aiohttp.web import Request, Response, json_response
from botbuilder.core import (BotFrameworkAdapterSettings, TurnContext, BotFrameworkAdapter, )
from botbuilder.core.integration import aiohttp_error_middleware
from botbuilder.schema import Activity, ActivityTypes

from bots import EchoBot
from config import DefaultConfig

CONFIG = DefaultConfig()

# Create adapter.
# See https://aka.ms/about-bot-adapter to learn more about how bots work.
SETTINGS = BotFrameworkAdapterSettings(CONFIG.APP_ID, CONFIG.APP_PASSWORD)
ADAPTER = BotFrameworkAdapter(SETTINGS)


# Catch-all for errors.
async def on_error(context: TurnContext, error: Exception):
    # This check writes out errors to console log .vs. app insights.
    # NOTE: In production environment, you should consider logging this to Azure
    #       application insights.
    print(f"\n [on_turn_error] unhandled error: {error}", file=sys.stderr)
    traceback.print_exc()

    # Send a message to the user
    await context.send_activity("The bot encountered an error or bug.")
    await context.send_activity(
        "To continue to run this bot, please fix the bot source code."
    )
    # Send a trace activity if we're talking to the Bot Framework Emulator
    if context.activity.channel_id == "emulator":
        # Create a trace activity that contains the error object
        trace_activity = Activity(
            label="TurnError",
            name="on_turn_error Trace",
            timestamp=datetime.utcnow(),
            type=ActivityTypes.trace,
            value=f"{error}",
            value_type="https://www.botframework.com/schemas/error",
        )
        # Send a trace activity, which will be displayed in Bot Framework Emulator
        await context.send_activity(trace_activity)


ADAPTER.on_turn_error = on_error

# Create the Bot
BOT = EchoBot()


# Listen for incoming requests on /api/messages
async def messages(req: Request) -> Response:
    # Main bot message handler.
    if "application/json" in req.headers["Content-Type"]:
        body = await req.json()
    else:
        return Response(status=415)

    activity = Activity().deserialize(body)
    auth_header = req.headers["Authorization"] if "Authorization" in req.headers else ""

    response = await ADAPTER.process_activity(activity, auth_header, BOT.on_turn)

    if response:
        return json_response(data=response.body, status=response.status)
    return Response(status=201)

APP = web.Application(middlewares=[aiohttp_error_middleware])
APP.router.add_post("/api/messages", messages)
if __name__ == "__main__":


    try:
        web.run_app(APP, host="localhost", port=CONFIG.PORT)
    except Exception as error:
        raise error

При локальном запуске я могу, например, установить порт на 8000, указать ngrok на localhost и указать URL-адрес в регистрации моих каналов бота, и все работает нормально. Я пытался буквально все, чтобы заставить мой код работать в Azure, но я просто не могу это сделать. Я настроил скрипт для запуска на порту 8000 и установил параметры в настройках приложения (я пробовал PORT и WEBSITES_PORT, потому что я прочитал, что иногда один из флагов не работает : Настройки приложения в Azure

В журнале все равно говорится:

Контейнер mycontainer для сайта leobot-msbot вышел, сбой при запуске сайта ОШИБКА - Контейнер mycontainer не выполнен отвечать на HTTP-запросы на порт: 8000, сбой при запуске сайта. См. журналы контейнеров для отладки.

Я также пробовал дюжину команд запуска, но просто не могу понять. Редактировать: Найдено https://docs.microsoft.com/en-us/azure/app-service/containers/how-to-configure-python и добавили "python3 .7 -m aiohttp.web -H localhost -P 8000 application: init_fun c" в качестве команды запуска и изменили код на

def init_func(argv):
    APP = web.Application(middlewares=[aiohttp_error_middleware])
    APP.router.add_post("/api/messages", messages)
    return APP
if __name__ == "__main__":
    APP = init_func(None)

    try:
        web.run_app(APP, host="localhost", port=CONFIG.PORT)
    except Exception as error:
        raise error

затем в журнале написано -> см. Рисунок: извлечение журнала ... OSError: ошибка [Errno 99] при попытке связать по адресу (':: 1', 8000, 0 , 0): невозможно назначить запрашиваемый адрес

Может быть, кто-то как опыт с этим и может помочь мне:)

1 Ответ

0 голосов
/ 03 марта 2020

Итак, после двухдневной настройки моего бота, я наконец нашел ответ. С помощью этой статьи и этой статьи от Microsoft .

В разделе Настройки-Конфигурация я добавил команду запуска

python3.7 -m aiohttp.web -H 0.0.0.0 -P 8000 application:init_func

Важно здесь это не использовать localhost, а 0.0.0.0!

В моем файле application.py я добавил init fun c, как упоминалось ранее, и изменил код на

def init_func(argv):
    APP = web.Application(middlewares=[aiohttp_error_middleware])
    APP.router.add_post("/api/messages", messages)
    return APP
if __name__ == "__main__":
    APP = init_func(None)

    try:
        web.run_app(APP, host="0.0.0.0", port=CONFIG.PORT)
    except Exception as error:
        raise error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...