我有一个单页应用程序 - 前端使用 Angularjs,后端使用 flask,它允许用户上传文件(xlsx、csv...),然后以交互方式分析/查询文件
本质上,用户在第一次上传时将文件加载到内存中,然后后续的 ajax 调用将利用内存中的该文件。我不确定如何在后续请求 (ajax) 之间将文件保存在内存中。
g 变量在每次请求后被删除,如果我理解正确用于跨请求访问值(通常由 before_request 设置并且在整个 中可用意见
请求上下文是请求的本地内容。我确实设法在 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 内存中的方法似乎不正确,而且感觉太脏/太老套了。这会规模吗?
我可以在每次请求后 pickle 文件,并在每次请求时将其拉回。但是,当用户交互式查询数据时,每次都将文件存储/pickling 并重新提取到内存中似乎过于繁重/效率低下
是否有任何其他优雅/正确的方法来执行此操作,app_context、werkzeug locals 等?还是我的想法全错了?
最佳答案
如果您的网络服务器正在生成多个进程(工作程序)来处理请求,那么以这种方式存储文件将行不通,这就是大多数生产服务器的工作方式。
如果您的服务器负载增加,进一步将文件对象保存在内存中不会扩展,您可以将文件保存在文件系统中并在每次请求期间初始化 pandas 对象。您可以将此与加载腌制对象进行比较,看看哪个更快。您还必须考虑 pickling 的开销,而不仅仅是 unpickling。
编辑:解释为什么它不能在生产中工作
Gunicorn 和类似的网络服务器很可能会生成多个 worker,除非你在配置中进行限制,一个 worker 本质上是一个单独的进程,每个进程都有自己的 python 执行环境。因此,假设您的第一个请求命中了 worker1,并且您在该过程中创建了一个变量 current_app.file = file_in_memory。然后你的第二个请求可能会命中 worker2,它有自己的 python 执行环境,你的变量在其中不可用,因为它们不跨进程共享。事实上,该变量中可能有一个值,但它属于不同的用户请求。
总而言之
关于python - Flask - 在请求之间将值存储在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31407593/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.