在 Flask 中上传后在后台解析文档
Parse document in background after upload in Flask
我正在尝试创建一个简单的 Flask 应用程序来解析 csv 文件。我希望在后台解析文件,这样用户就不必等待。我探索了线程和多处理,但我不确定最好的选择是什么。
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
location = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(location)
parser = Parser(location)
thread = Thread(target=parser.read_csv())
thread.daemon = True
thread.start()
return redirect(url_for('uploaded_file'))
return render_template('index.html')
我怎样才能以这样的方式构建它:
- 用户上传文件
- 在后台解析 csv 时用户被重定向到另一个页面?
承认网页应提供 sub-second 响应时间的荣誉,
即使处理 .csv 可能需要比这更长的时间。
您已经进行了后台线程处理。
如果你想要更好的隔离,你可以分叉 child。
您可以立即向结果提供带有 link 的页面,
并希望人类为您提供足够长的交互延迟
那个处理到那时就完成了。
或者立即302重定向到这样的页面。
或者有结果页面估计(来自.csv文件大小)
处理完成时,将 that 显示为 "sorry, you lose"
在它应该准备好时邀请点击的页面。
即使没有合理的估计,您也可以硬编码 ten-second 次重试。
页面可以 auto-refresh,轮询直到处理完成。
参见 https://en.wikipedia.org/wiki/Meta_refresh。
您可以自适应地减少 n = 5; meta = f'content="{n}; url=/results"'
因此 n
会随着结果文件接近其最终长度而变小。
像 websockets 或 long-poll 这样的异步技术会让你的
服务器在解析结果可用时准确通知浏览器,
但对于当前的用例来说,这听起来有点矫枉过正。
我正在尝试创建一个简单的 Flask 应用程序来解析 csv 文件。我希望在后台解析文件,这样用户就不必等待。我探索了线程和多处理,但我不确定最好的选择是什么。
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
location = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(location)
parser = Parser(location)
thread = Thread(target=parser.read_csv())
thread.daemon = True
thread.start()
return redirect(url_for('uploaded_file'))
return render_template('index.html')
我怎样才能以这样的方式构建它:
- 用户上传文件
- 在后台解析 csv 时用户被重定向到另一个页面?
承认网页应提供 sub-second 响应时间的荣誉, 即使处理 .csv 可能需要比这更长的时间。
您已经进行了后台线程处理。 如果你想要更好的隔离,你可以分叉 child。
您可以立即向结果提供带有 link 的页面, 并希望人类为您提供足够长的交互延迟 那个处理到那时就完成了。 或者立即302重定向到这样的页面。
或者有结果页面估计(来自.csv文件大小) 处理完成时,将 that 显示为 "sorry, you lose" 在它应该准备好时邀请点击的页面。 即使没有合理的估计,您也可以硬编码 ten-second 次重试。
页面可以 auto-refresh,轮询直到处理完成。
参见 https://en.wikipedia.org/wiki/Meta_refresh。
您可以自适应地减少 n = 5; meta = f'content="{n}; url=/results"'
因此 n
会随着结果文件接近其最终长度而变小。
像 websockets 或 long-poll 这样的异步技术会让你的 服务器在解析结果可用时准确通知浏览器, 但对于当前的用例来说,这听起来有点矫枉过正。