我有一个API端点,在这个端点中,我试图处理csv文件,并在刮取完成后将它传递给刮取函数--我正在下载由刮刀函数生成的csv文件,所有这些都如我所期望的那样起作用,但当我上传csv文件几秒钟后将它部署到heroku时,它会出现503个响应,这意味着请求超时。因此,我想问一下,如何正确地处理请求超时错误,在刮板运行和文件下载之前,它不会崩溃和运行。
import fastapi as _fastapi
from fastapi.responses import HTMLResponse, FileResponse
import shutil
import os
from scraper import run_scraper
app = _fastapi.FastAPI()
@app.get("/")
def index():
content = """
<body>
<form method="post" action="/api/v1/scraped_csv" enctype="multipart/form-data">
<input name="csv_file" type="file" multiple>
<input type="submit">
</form>
</body>
"""
return HTMLResponse(content=content)
@app.post("/api/v1/scraped_csv")
async def extract_ads(csv_file: _fastapi.UploadFile = _fastapi.File(...)):
temp_file = _save_file_to_disk(csv_file, path="temp", save_as="temp")
await run_scraper(temp_file)
csv_path = os.path.abspath(clean_file)
return FileResponse(path=csv_path, media_type="text/csv", filename=clean_file)
def _save_file_to_disk(uploaded_file, path=".", save_as="default"):
extension = os.path.splitext(uploaded_file.filename)[-1]
temp_file = os.path.join(path, save_as + extension)
with open(temp_file, "wb") as buffer:
shutil.copyfileobj(uploaded_file.file, buffer)
return temp_file这是应用程序的链接。
发布于 2022-05-24 20:29:52
我目前看到了两种可能性。
第一,增加超时前的等待时间。如果您使用Gunicorn,您可以使用-t INT或--timeout INT,知道值是正数或0。将其设置为0会完全禁用所有工作人员的超时,从而产生无限超时的效果。
第二,使用异步请求/响应。您可以立即响应202,并告诉客户端他可以跟踪任务的状态,但是这需要创建一个新的端点、新的逻辑等等.
发布于 2022-05-24 22:14:26
一个可能的解决方案是@fchancel的建议。通过Redis队列作为后台任务运行抓取,并通知用户已经创建了一个带有job_id (在redis中的键)的作业。worker dynos可以将后台作业的结果存储在blob存储中。您可以使用job_id从blob存储中获取结果。
为了了解这份工作的现状,请看一下这个question。
https://stackoverflow.com/questions/72368799
复制相似问题