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 шт):
для того что бы получить тело запроса отправленного яндексом вы должны преобразовать request в json
aliceReq = await request.json()
И дальше уже получать данные, типа
version = aliceReq["version"]
И так далее.