-1

我是 python 和 flask 的新手,我遇到了 Flask 的问题。我正在尝试使用本地 HTTP POST (webhook) 从另一个文件调用函数,但是当我执行任何操作时什么都没有发生。

from flask import Flask
from BotSpeak import main

app = Flask(__name__)

@app.route('/', methods=['POST'])
def respond():
    main('hello')

if __name__ == '__main__':
    app.run()

这是我非常基本的 Flask 应用程序。如您所见,它正在尝试从此文件(BotSpeak)调用主函数:

from json import dumps
from httplib2 import Http

def main(botmsg):
    url = 'PLACEHOLDER FOR GOOGLE CHAT WEBHOOK URL'
    bot_message = {
        'text' : botmsg}

    message_headers = {'Content-Type': 'application/json; charset=UTF-8'}

    http_obj = Http()

    response = http_obj.request(
        uri=url,
        method='post',
        headers=message_headers,
        body=dumps(bot_message),
    )

    print(response)

if __name__ == '__main__':
    main("TEST MESSAGE")

这是将本地 HTTP POST 发送到我的烧瓶应用程序的代码:

import json
import requests

webhook_url ='http://127.0.0.1:5000/'

data = {PLACE HOLDER FOR JSON DATA}

r = requests.post(webhook_url, data=json.dumps(data), headers={'Content-Type': 'application/json'})

我可以从烧瓶应用程序之外的其他文件调用主函数,它会工作,但它不会像它应该那样在 app.route 装饰器中触发。我非常感谢任何人的帮助,我鼓励您将这些投入到 VS Code 中并亲自尝试。

4

1 回答 1

1

如果您使用的是烧瓶,则不必使用 httplib2 手动构建 HTTP 响应,除非您有一些非常具体的用例。

在您的情况下,您可以return bot_message因为如果 Flask 处理程序的返回值是一个 dict ,它将把它转换为 JSON 响应(包括正确的标头)。看

https://flask.palletsprojects.com/en/2.0.x/quickstart/#about-responses

换句话说,您的整个路由处理程序可以被重写(至少基于您的示例):

@app.route('/', methods=['POST'])
def respond():
    return {'text': 'hello'}

如果您想将处理传递给某些实用程序函数,您也可以这样做,只需确保它返回一个值,然后您又从您的respond()函数返回一个适当的值。

于 2021-07-20T16:31:48.257 回答