【问题标题】:How to hit an endpoint automatically after flask app is up?烧瓶应用程序启动后如何自动命中端点?
【发布时间】:2020-01-29 11:05:37
【问题描述】:

我正在开发一个烧瓶应用程序,它不断检查来自 AWS SQS 队列的新消息并接收它们。为此,我编写了一个可以由端点触发的函数。 -/start。为简单起见,在代码中,我没有发布从 SQS 队列接收消息的所有逻辑。只需打印日期时间并等待 3 秒。

如何在烧瓶服务器启动并准备好为请求提供服务后立即访问此端点?

是否有任何装饰器或其他东西可以使这成为可能?

quque_services.py:

from datetime import datetime
import time
def receive_messages():
    print(datetime.now())
    time.sleep(3)

__init__.py:

from flask import Flask, request, jsonify
from app.workload.services.queue_services import receive_messages

def create_app(**kwargs):
    app = Flask(__name__, **kwargs)

    @app.route('/start')
    def queue_receiver():
        while True:
            receive_messages()

    return app

wsgi.py:

from app import create_app

application = create_app()

if __name__ == "__main__":
    application.run()

【问题讨论】:

  • 那你真的需要一个 Flask 应用吗?在我看来,如果你只是在 main 块中调用 receive_messages,它就可以在不需要 HTTP 服务器的情况下工作。
  • 我还需要提供 API 以根据被命中的端点管理此 receive_messages 功能。
  • 这里的问题是while循环会阻塞HTTP服务器。 IMO,这应该是两个独立的应用程序(Flask 应用程序将接受 HTTP 请求以发布新消息,另一个专用于接收和处理消息)。如果您不想这样做,也许您可​​以像这里描述的那样启动一个子流程:stackoverflow.com/questions/28800614/…
  • 我同意 HTTP 服务器因该请求而被阻止。我只需要在服务器启动后点击它。现在我需要手动点击端点。并且正在打印datetime。随着datetime 正在控制台上打印,其他 API 正在无任何阻塞地提供服务。
  • 作为 http 服务器旁边的celery 应用程序会不会更好?我同意@frankie567 的观点,在 API 的端点上有一个像这样的连续循环是一个奇怪的设计结构——为什么不把这个过程单独运行到烧瓶组件呢?

标签: python api flask amazon-sqs wsgi


【解决方案1】:

您可以在创建应用程序后使用烧瓶测试客户端向应用程序发送请求。我已将您的代码简化为一个独立的脚本,用于演示这一点。

from flask import Flask

def create_app(**kwargs):
    app = Flask(__name__, **kwargs)

    @app.route('/start')
    def queue_receiver():
        print("***Endpoint hit***")
        return ""

    return app

application = create_app()

if __name__ == "__main__":
    application.test_client().get('/start')
    print("***Starting server***")
    application.run()

如果这不适用于您的代码,那么我怀疑这是因为您永远不会从您的 /start 端点返回。当所有消息都被处理但为了简洁起见没有包含代码时,我假设你正在打破你的 while True 循环。如果不是这种情况,那么可能需要按照之前 cmets 中的建议将应用程序拆分为单独的客户端和服务器。

【讨论】:

  • 还是不行。 :-( 。当test_client 高于run 时,应用程序未启动。
猜你喜欢
  • 2015-02-12
  • 2019-11-23
  • 2021-11-06
  • 2017-10-18
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
相关资源
最近更新 更多