python - Flask:@app.route 中的代码在第二次调用时失败(永远运行)
问题描述
我在 Flask 路由中执行了一些 Python metapy 代码,该路由在第一次调用该路由时运行得非常好(即用户在应用程序启动后提交表单)但它在第二次运行时不会终止(即应用程序启动后第二次提交表单)。
恰恰:
@app.route('/search', methods=['POST'])
def searchPageResults():
form = SearchForm(request.form)
import metapy
idx = metapy.index.make_inverted_index(os.path.abspath("search/config.toml"))
ranker = metapy.index.OkapiBM25()
query = metapy.index.Document()
query.content("auto")
for result in ranker.score(idx, query):
print(result)
return render_template('SearchPage.html', form=form)
如果我在 Flask 外部运行该方法内的代码片段(无论我调用它多少次),它都可以正常运行。只有在用 @app.route(...) 装饰的方法内部,它似乎只运行一次。具体来说:ranker.score(...) 函数是永远运行的函数。由于代码在烧瓶外运行良好,我认为在我不明白的背景中发生了一些烧瓶特定的事情。
到目前为止我尝试了什么(但没有帮助):
- 当我在文件顶部有“import metapy”语句时,即使是对 ranker.score(...) 的第一次调用也会永远运行。
- 我确保“import metapy”和“idx”和“ranker”的初始化只运行一次,方法是将搜索功能放在一个自己的类中,该类在 Flask 服务器启动时实例化。但是,即使在第一次调用路由时,代码也不会运行。
Flask 是否有特定的东西来解释这种行为?
----更新:附加信息----- config.toml
index = "idx"
corpus = "line.toml"
dataset = "data"
prefix = "."
stop-words = "search/german-stopwords.txt"
start-exceptions = "search/sentence-start-exceptions.txt"
end-exceptions = "search/sentence-end-exceptions.txt"
function-words = "search/function-words.txt"
punctuation = "search/sentence-punctuation.txt"
[[analyzers]]
method = "ngram-word"
ngram = 1
filter = [{type = "icu-tokenizer"}, {type = "lowercase"}]
如前所述,该行为仅在此 Flask 路由的第二次调用之后发生。本地一切正常(使用完全相同的数据集和 config.toml)
更新:MetaPy Flask 演示应用程序 中的相同行为我在 MetaPy 演示应用程序中具有相同的行为:https ://github.com/meta-toolkit/metapy-demos 。(唯一的区别是,由于可用性的原因,我需要为某些软件包在 requirements.txt 中指定一些较新的版本)。
解决方案
解决了。Flask 集成网络服务器出现问题。一旦部署到另一个网络服务器,问题就解决了。
推荐阅读
- jquery - 使用 jquery更改 SVG标签
- javascript - Ajax 不刷新联系表单(PHP 和 Bootstrap 4)
- javascript - 如何自动检测具有相同类名的当前表单元素
- c# - 构建错误 - Roslyn MSB3883:意外异常: System.Security.Principal.Windows 的 System.IO.FileNotFoundException
- python - Python shutil.copytree 说它应该复制的目标文件丢失
- reactjs - 语义用户界面反应选择表格单元格不起作用
- vue.js - 使用 vuex 和 vue-router 时未定义的数据
- r - R:动态调整输出pdf大小以绘制函数内的区域
- reactjs - 通过 electron 调用 watson 的创建分类器 API
- google-cloud-bigtable - opentsdb 查询响应中返回的标签值为“node”是什么意思?