那么,到目前为止,我正在返回指向“下载”页面的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如何处理正常将用户重定向到“下载”页面后完成处理,您想实现下面提供的解决方案之一。 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
工作示例
app.pyIndex.html
/download
Templates/Download.htmlFileResponse