后台任务完成后,redirect to另一个网页

问题描述 投票:0回答:1
过程已经完成?

那么,到目前为止,我正在返回指向“下载”页面的HTML响应,但是如果用户在过程完成之前单击它,则他们可能无法获得正确的结果:

@router.post("/run") async def run(background_tasks: BackgroundTasks) -> HTMLResponse: """ 1. Run model. 2. Retrieve output file. """ background_tasks.add_task(optimization_process) content = """ <label for="file">Generating results:</label><br> <progress id="file" max="100" value="70"> 70% </progress><br> <body> Visit <a href="./get-results">result page</a> to get the results </body> """ return HTMLResponse(content=content) 我希望通过告知用户开始并将其重定向到下一个屏幕

后成功运行

optimization_process

.

首先,我建议您看看thisanders和this答案

,以便更好地了解Fastapi与
def

端点和/或背景任务相比,Fastapi如何处理正常
javascript python http-redirect fastapi background-task
1个回答
2
投票
您使用的功能是作为背景任务(即使您在问题中尚未提供)表明您可能会在内部执行阻止CPU结合的操作。因此,背景任务可能不是最佳选择,或者您可能不会以正确的方式使用它(例如,您可能在内部运行阻止事件循环的阻止操作,而它应该在单独的线程或过程 - 上面的链接答案中给出了更多详细信息和示例)。

将用户重定向到“下载”页面完成处理,您想实现下面提供的解决方案之一。 Solution1

一种解决方案是用唯一的
optimization_process()
立即响应用户(调用
/run
路由之后),他们可以用来检查其请求状态(即,其请求的处理是否仍然是perdending

done

),类似于thisAnswer和thisAnswer的选项2。处理完成后,用户可以继续使用给定

id

来调用

/download

路由,以便下载结果。

SULOTIE2
该解决方案遵循与上一个解决方案相同的概念,而不是让用户检查状态并将自己重定向到
id页,而是可以通过具有JavaScript函数来自动化此过程,以定期检查该过程请求并将用户重定向到“下载”页面,一旦处理完成后。 注意,出于安全/隐私原因,如this Answers的解决方案1中概述(有关更多详细信息,请参见此信息),在下面的示例中,/download传递给请求正面而不是查询字符串。因此,这就是使用POST请求方法而不是GET,尝试检查请求状态以及检索/下载结果时的原因。如果在您的情况下不重要,或者您有一个身份验证系统,可以防止未经授权的用户访问敏感信息(即使他们手中有任务id),则可以使用GET请求并通过作为查询或路径参数的URL到URL。 为结果,如果您想在
id
页页中包含“下载”文件链接,以供用户单击并下载一些文件,请查看上面的解决方案1中的第二个链接答案如何实现这一目标。您还可以让您的fastapi应用程序返回一个
id
(请参阅this this this this this this this this ther this ther this this this this this this there the the the the the the the deentpoint时,而不是jinja2 template)可能导致另一个端点返回

download.html

,类似于上面解决方案1中的第二个链接答案中的一个。这样,一旦请求处理完成,就可以自动触发文件下载过程,而无需让用户单击“下载”页面中的链接 - 所有这些都取决于一个人的需求和要求,以选择哪种方法.

工作示例

app.py

RedirectResponse templates/

Index.html
/download
Templates/

Download.html

FileResponse
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.