gpt4 book ai didi

python - 如何使用 flask 将异步请求发送到具有小超时 session 的端点?

转载 作者:太空狗 更新时间:2023-10-29 19:35:48 25 4
gpt4 key购买 nike

我是使用 Flask 进行后端开发的新手我陷入了一个令人困惑的问题。我正在尝试将数据发送到超时 session 为 3000 毫秒的端点。我的服务器代码如下。

from flask import Flask, request
from gitStat import getGitStat

import requests

app = Flask(__name__)


@app.route('/', methods=['POST', 'GET'])
def handle_data():
params = request.args["text"].split(" ")

user_repo_path = "https://api.github.com/users/{}/repos".format(params[0])
first_response = requests.get(
user_repo_path, auth=(
'Your Github Username', 'Your Github Password'))

repo_commits_path = "https://api.github.com/repos/{}/{}/commits".format(params[
0], params[1])
second_response = requests.get(
repo_commits_path, auth=(
'Your Github Username', 'Your Github Password'))

if(first_response.status_code == 200 and params[2] < params[3] and second_response.status_code == 200):

values = getGitStat(params[0], params[1], params[2], params[3])

response_url = request.args["response_url"]

payload = {
"response_type": "in_channel",
"text": "Github Repo Commits Status",
"attachments": [
{
"text": values
}
]
}

headers = {'Content-Type': 'application/json',
'User-Agent': 'Mozilla /5.0 (Compatible MSIE 9.0;Windows NT 6.1;WOW64; Trident/5.0)'}

response = requests.post(response_url, json = test, headers = headers)

else:

return "Please enter correct details. Check if the username or reponame exists, and/or Starting date < End date. \
Also, date format should be MM-DD"

我的服务器代码从它收到的请求和该请求的 JSON 对象中获取参数,它提取代码的参数。此代码执行 getGitStats 函数并将服务器代码中定义的 JSON 负载发送到它从中接收请求的端点。

我的问题是我需要向端点发送一条文本确认信息,表明我已收到请求并且数据很快就会到来。这里的问题是函数 getGitStats 从 Github API 获取和解析数据需要一分多钟。

我在互联网上搜索了一下,发现我需要让这个调用异步进行,我可以使用队列来做到这一点。我尝试使用 RQRabbitMQ 来理解该应用程序,但我既不理解也无法将我的代码转换为异步格式。有人可以给我指点或任何关于如何实现这一目标的想法吗?

谢谢。

------------更新------------

线程能够解决这个问题。创建另一个线程并调用该线程中的函数。

最佳答案

如果您尝试在请求中执行异步任务,则必须决定是否需要结果/进度。

  1. 您不关心任务的结果或在处理任务时是否出现任何错误。您可以只在线程中处理它而忘记结果。
  2. 如果您只想了解任务的成功/失败情况。您可以将任务的状态存储在数据库中,并在需要时进行查询。
  3. 如果您想要任务的进度(完成 20% ... 完成 40%)。您必须使用更复杂的东西,例如 celeryrabbitMQ

对于您来说,我认为选项 #2 更合适。您可以创建一个简单的表 GitTasks。

  GitTasks
------------------------
Id(PK) | Status | Result
------------------------
1 |Processing| -
2 | Done | <your result>
3 | Error | <error details>

您必须在 python 中创建一个简单的 Threaded 对象才能进行处理。

 import threading  
class AsyncGitTask(threading.Thread):
def __init__(self, task_id, params):
self.task_id = task_id
self.params = params
def run():
## Do processing
## store the result in table for id = self.task_id

您必须创建另一个端点来查询您的任务状态。

  @app.route('/TaskStatus/<int:task_id>')
def task_status(task_id):
## query GitTask table and accordingly return data

现在我们已经构建了所有组件,我们必须将它们放在您的主要请求中。

  from Flask import url_for
@app.route('/', methods=['POST', 'GET'])
def handle_data():
.....
## create a new row in GitTasks table, and use its PK(id) as task_id
task_id = create_new_task_row()
async_task = AsyncGitTask(task_id=task_id, params=params)
async_task.start()

task_status_url = url_for('task_status', task_id=task_id)
## This is request you can return text saying
## that "Your task is being processed. To see the progress
## go to <task_status_url>"

关于python - 如何使用 flask 将异步请求发送到具有小超时 session 的端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37141696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com