FastApi и Алиса

Кто имел опыт разработки навыка для Алисы не на Flask, а на FastApi? Кучу информации уже перевернул - никак не могу данные получить от Алисы.

Навык создал, сервер указал. В тестировании возвращает мою указанную строку в ответе: "Hi!":

@app.post('/api/alisa')
async def api_alisa(request: Request):
    http_version = request['http_version']
    content = {
                'response': {
                            "text": 'Hi!'
                            },
                'version': http_version,
                'status_code': 200
               }

    headers = {"Content-Language": "RU"}
    return JSONResponse(content=content, headers=headers)

Но вернуть то, что вводит пользователь не получается. В API указано, что запрос имеет следующий вид:

Request:
{
  "meta": {
    "locale": "ru-RU",
    "timezone": "UTC",
    "client_id": "ru.yandex.searchplugin/7.16 (none none; android 4.4.2)",
    "interfaces": {
      "screen": {},
      "payments": {},
      "account_linking": {}
    }
  },
  "session": {
    "message_id": 0,
    "session_id": "a74c41a9-2sbsbsbsfgbf454",
    "skill_id": "f389738b-gbfgbfdgbfdgbdf3efb3ea8",
    "user": {
      "user_id": "15C2EF939Bdfgbdfgbfdgb96B76EB2DFC9BB3F6D6B5A45129"
    },
    "application": {
      "application_id": "dfgbdfgbfdgb44E218C80E332CF49DC3791C04071C173610DFE9746"
    },
    "new": true,
    "user_id": "asdvasvasdv6F63644E218C80E332CF49DC3791C04071C173610DFE9746"
  },
  "request": {
    "command": "",
    "original_utterance": "",
    "nlu": {
      "tokens": [],
      "entities": [],
      "intents": {}
    },
    "markup": {
      "dangerous_context": false
    },
    "type": "SimpleUtterance"
  },
  "version": "1.0"

Но указанные ключи я не вижу. Решил посмотреть что там вообще приходит:

@app.post('/api/alisa')
async def api_alisa(request: Request):
    http_version = request['http_version']
    mes = ''
    for i, v in request.items():
        mes += f'{i} : {str(v)}\n'
    content = {
                'response': {
                            "text": mes[0:1024]
                            },
                'version': http_version,
                'status_code': 200
               }

    headers = {"Content-Language": "RU"}
    return JSONResponse(content=content, headers=headers)

Но он мне вернул вообще не ту структуру, которая написана в руководстве:

type : http
asgi : {'version': '3.0', 'spec_version': '2.3'}
http_version : 1.0
server : ('127.0.0.1', 5003)
client : ('35.255.253.42', 0)
scheme : https
method : POST
root_path :
path : /api/alisa
raw_path : b'/api/alisa'
query_string : b''
headers : [(b'host', b'my_domain.ru:8002'), (b'x-real-ip', b'35.255.253.42'), (b'x-forwarded-for', b'35.255.253.42'), (b'x-forwarded-proto', b'https'), (b'connection', b'close'), (b'content-length', b'752'), (b'user-agent', b'Mozilla/5.0 (compatible; YandexDialogs/1.0; +http://yandex.com/bots)'), (b'accept', b'application/json'), (b'accept-encoding', b'gzip,deflate'), (b'content-type', b'application/json'), (b'request-timeout', b'3100000')]
app : <fastapi.applications.FastAPI object at 0x7f5d5d364ca0>
fastapi_astack : <contextlib.AsyncExitStack object at 0x7f5d5a069fa0>
router : <fastapi.routing.APIRouter object at 0x7f5d5a54e8b0>
endpoint : <function api_alisa at 0x7f5d5a043a60>
path_params : {}
route : <fastapi.routing.APIRoute object at 0x7f5d5a047be0>

Вопрос: как мне получить введенные данные пользователя от Алисы?


Ответы (1 шт):

Автор решения: Beqa Gozalishvili

для того что бы получить тело запроса отправленного яндексом вы должны преобразовать request в json

aliceReq = await request.json()

И дальше уже получать данные, типа

version = aliceReq["version"]

И так далее.

→ Ссылка