Вы можете использовать дополнительную скобку:
subkeyword = (
Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
.filter_by(subkeyword_company_id=self.e_company_id)
.filter_by(subkeyword_word=subkeyword_word)
.filter_by(subkeyword_active=True)
.one()
)
У вас есть несколько вопросов здесь, поэтому трудно точно сказать, какая из них является реальной проблемой, но все они сводятся к следующему утверждению в вашем вопросе:
[1115 ] Пожалуйста, не спрашивайте меня, почему я использовал определенный кусок кодаblockquote>
Мы понимаем, что вы новичок - мы все были там! Но копирование кода без понимания того, что он должен делать, - рискованный путь.
Тем не менее, в вашем дизайне и коде есть несколько моментов, которые вызывают у меня проблемы:
Микширование библиотек
Вы, кажется, загружаете оба библиотека Actions-on-Google и библиотека выполнения диалогового потока. Хотя большая часть того, что вы делаете, связана с библиотекой actions-on-google,
intentMap
- это то, что используется библиотекой d-f.Вы не можете смешать два. Выберите один и поймите, как регистрировать обработчики и как эти обработчики выбираются.
Зарегистрируйте обработчики в Actions-on-Google
Если вы используете библиотеку aog, вы обычно создаете объект
[110 ]app
с чем-то вроде, а затем зарегистрировать каждый обработчик с помощью чего-то вроде
app.intent( 'intent name', conv => { // handler code here });
Вы зарегистрируете приложение для обработки запроса и ответа с помощью чего-то вроде
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Зарегистрируйте обработчик с диалоговым потоком выполнения
Подход диалога выполнения аналогичен, но он предлагает создать
Map
, который отображает имя намерения на функцию обработчика. Примерно так:let intentMap = new Map(); intentMap.set( 'intent name', handlerFunction );
Где
handlerFunction
- это также имя функции, которую вы хотите использовать в качестве обработчика. Это может выглядеть примерно такfunction handlerFunction( agent ){ // Handler stuff here }
Затем вы можете создать агент, установить объекты запроса и ответа, которые он должен использовать, и указать ему использовать карту, чтобы выяснить, какой обработчик намерений вызывать с чем-то вроде [ 1128]
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => { const agent = new WebhookClient({ request, response }); agent.handleRequest( intentMap );
Intents представляют то, что делает пользователь , а не то, что вы делаете с ним
Помните, что Intents представляют действие пользователя.
То, что вы делаете на основе этого действия, зависит от многих вещей. В вашем случае, после того, как они выбрали опцию, вы хотите ответить так же, как если бы они вызвали ее с определенным намерением. Правильно?
Вы не делаете это, пытаясь вызвать это намерение.
То, что вы делаете, это то, что у вас есть оба обработчика, вызывающие функцию, которая делает то, что вы хотите. В этом нет ничего особенного - оба просто вызывают одну и ту же функцию, как и многие другие программы, которые могут вызывать общие функции.
Не пытайтесь динамически регистрировать обработчики
В связи с предыдущей проблемой, попытка зарегистрировать новый обработчик внутри существующего обработчика не будет делать то, что вы хотите. К тому времени уже слишком поздно, и обработчики уже вызваны.
Могут быть ситуации, когда это имеет смысл - но их очень мало, далеко друг от друга, и очень очень продвинутая концепция. В общем, зарегистрируйте все ваши обработчики в центральном месте, как я обрисовал выше.