【发布时间】:2015-07-14 13:10:01
【问题描述】:
我有一个单页应用程序 - 前端是 Angularjs,后端是烧瓶,它允许用户上传文件(xlsx、csv...),然后交互式地分析/查询文件
基本上用户在第一次上传时将文件加载到内存中,然后后续的 ajax 调用将在内存中访问该文件。我不确定如何在后续请求(ajax)之间将文件保存在内存中。
g 变量在每次请求后都会被删除,如果我理解用于跨请求访问值的权利(通常由 before_request 设置并且可通过 views 全部使用)
请求上下文是请求本地的。我确实设法在 current_app 上设置了值,然后能够在我随后的 ajax 调用中访问它
# On my first file upload, i load the file into memory
and set it to a variable on current_app:
from flask import current_app
@app.route('/upload', methods =['POST'])
def upload():
...
upload file into memory
...
current_app.file = file_in_memory
@app.route('/subsequent_call')
def subsequent():
# i'm able to access the file in memory through
the current_app.file which i set earlier
return current_app.file.number_of_lines()
这种将文件存储在 current_app 内存中的方法看起来并不正确,而且感觉太脏/太黑了。这会扩大规模吗?
我可以在每次请求后腌制文件并在每次请求时将其拉回。但是,当用户以交互方式查询数据时,每次都将文件存储/酸洗和重新提取到内存中似乎过于繁重/效率低下
还有其他优雅/正确的方法可以做到这一点,app_context,werkzeug locals 等吗?还是我想的都错了?
【问题讨论】:
-
在 Web 服务器上存储状态是非常糟糕的做法。为什么它需要在内存中?
-
@Jharris:同意网络服务器存储状态。当我将文件加载到熊猫对象中时,该文件需要在内存中。在请求之间腌制 pandas 对象感觉有点太低效了。
-
例如,当您使用显式进程池时。当然,我可以将所有内容存储在数据库中,但在某些特定情况下使用内存会更有效。
标签: python ajax rest flask python-requests