我有一个在本地运行良好并部署到 Heroku 的 Flask 应用程序。主页可以访问并正确显示,但在提交将用户带到另一个页面的表单时,会引发 H13 错误:连接关闭而没有响应。
请求在本地完成需要 10 到 15 秒,但在 Heroku 中提交表单时,需要 30 秒然后崩溃。
知道为什么应用程序可以很好地部署到 Heroku 但在发送表单/更改页面时会引发此错误吗?
这是日志中的错误:
2021-06-01T21:51:53.871045+00:00 heroku[router]: at=info method=GET path="/" host=the-mgr-project.herokuapp.com request_id=ed08f910-e0b9-4c76-8bb3-3a82cc3ca59e fwd="213.55.220.236" dyno=web.1 connect=0ms service=2ms status=200 bytes=9082 protocol=https
2021-06-01T21:51:53.870405+00:00 app[web.1]: 10.79.199.219 - - [01/Jun/2021:21:51:53 +0000] "GET / HTTP/1.1" 200 8927 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
2021-06-01T21:52:30.223394+00:00 app[web.1]: [2021-06-01 21:52:30 +0000] [4] [CRITICAL] WORKER TIMEOUT (pid:103)
2021-06-01T21:52:31.246525+00:00 app[web.1]: [2021-06-01 21:52:31 +0000] [4] [WARNING] Worker with pid 103 was terminated due to signal 9
2021-06-01T21:52:31.250736+00:00 app[web.1]: [2021-06-01 21:52:31 +0000] [118] [INFO] Booting worker with pid: 118
2021-06-01T21:52:32.360804+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
2021-06-01T21:52:32.360844+00:00 app[web.1]: warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
2021-06-01T21:52:33.043821+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=POST path="/" host=the-mgr-project.herokuapp.com request_id=88d57e33-4d13-4c5b-a11e-d1ef3ee97d2c fwd="213.55.220.236" dyno=web.1 connect=0ms service=33025ms status=503 bytes=0 protocol=https
2021-06-01T21:52:33.983811+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator LogisticRegression from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:52:33.983830+00:00 app[web.1]: warnings.warn(
2021-06-01T21:52:33.983899+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator Pipeline from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:52:33.983900+00:00 app[web.1]: warnings.warn(
2021-06-01T21:52:33.984524+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator GridSearchCV from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:52:33.984525+00:00 app[web.1]: warnings.warn(
2021-06-01T21:52:34.008224+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator KNeighborsClassifier from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:52:34.008227+00:00 app[web.1]: warnings.warn(
2021-06-01T21:52:34.029465+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator DecisionTreeClassifier from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:52:34.029467+00:00 app[web.1]: warnings.warn(
2021-06-01T21:52:34.053156+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator RandomForestClassifier from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:52:34.053159+00:00 app[web.1]: warnings.warn(
2021-06-01T21:52:34.054204+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator SVC from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:52:34.054206+00:00 app[web.1]: warnings.warn(
2021-06-01T21:53:10.332060+00:00 app[web.1]: [2021-06-01 21:53:10 +0000] [4] [CRITICAL] WORKER TIMEOUT (pid:88)
2021-06-01T21:53:11.362566+00:00 app[web.1]: [2021-06-01 21:53:11 +0000] [4] [WARNING] Worker with pid 88 was terminated due to signal 9
2021-06-01T21:53:11.368584+00:00 app[web.1]: [2021-06-01 21:53:11 +0000] [133] [INFO] Booting worker with pid: 133
2021-06-01T21:53:11.542838+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=POST path="/" host=the-mgr-project.herokuapp.com request_id=69126ca8-1e2d-4dab-a27b-f5cd0bdce60a fwd="213.55.220.236" dyno=web.1 connect=0ms service=31491ms status=503 bytes=0 protocol=https
2021-06-01T21:53:12.723118+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
2021-06-01T21:53:12.723129+00:00 app[web.1]: warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
2021-06-01T21:53:15.004051+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator LogisticRegression from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:53:15.004065+00:00 app[web.1]: warnings.warn(
2021-06-01T21:53:15.004129+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator Pipeline from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:53:15.004129+00:00 app[web.1]: warnings.warn(
2021-06-01T21:53:15.004765+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator GridSearchCV from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:53:15.004766+00:00 app[web.1]: warnings.warn(
2021-06-01T21:53:15.036069+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator KNeighborsClassifier from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:53:15.036072+00:00 app[web.1]: warnings.warn(
2021-06-01T21:53:15.063638+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator DecisionTreeClassifier from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:53:15.063640+00:00 app[web.1]: warnings.warn(
2021-06-01T21:53:15.090726+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator RandomForestClassifier from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:53:15.090730+00:00 app[web.1]: warnings.warn(
2021-06-01T21:53:15.091483+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator SVC from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-01T21:53:15.091485+00:00 app[web.1]: warnings.warn(
我的档案:
web: gunicorn app:app
POST 方法的 HTML:
<form enctype=multipart/form-data action={{url_for('upload_file')}} method="POST" enctype="multipart/form-data">
<h3>Title</h3>
<label for="file-input" class="col-sm-4 col-form-label">The music (.wav):</label>
<input type="file" id="file-input" name="file" class="form-control w-100" required="true"/><br>
<br>
<div class="form-group">
<h4>Select a model</h4>
<input type="radio" id="logreg" name="model" value="logreg" required>
<label for="logreg">Logistic regression</label><br>
<input type="radio" id="knn" name="model" value="knn">
<label for="knn">K-nearest neighbors</label><br>
<input type="radio" id="randomforest" name="model" value="randomforest">
<label for="randomforest">Random forest</label><br>
<input type="radio" id="svm" name="model" value="svm">
<label for="svm">Kernel SVM</label><br>
</div>
<input type="submit" value="Submit" class="btn btn-primary" id="submit-button">
</form>
还有 app.py 文件:
@app.route('/', methods=['POST'])
def upload_file():
"""Main function that gets form infos, extract values from .wav and send result"""
if request.method == 'POST':
# Get informations from form: file and chosen model
model = request.form.get("model")
spec_checkbox = request.form.get("spectrogram")
chroma_checkbox = request.form.get("chroma")
tempo_checkbox = request.form.get("tempo")
uploaded_file = request.files['file']
filename = uploaded_file.filename
# If a file is selected, save it to uploads folder
if filename == '':
return 'No file selected'
else:
uploaded_file.save(secure_filename(filename))
track_path = "uploads/" + str(filename)
shutil.move(filename, track_path)
print(str(filename) + " has been downloaded and the chosen model is " + str(model))
# Extract features and remove file from upload folder
features = extract()
os.remove(track_path)
# Call function according to user choice
if model == 'logreg':
result_list = logreg(features[0], features[1])
elif model == 'knn':
result_list = knn(features[0], features[1])
elif model == 'randomforest':
result_list = randomforest(features[0], features[1])
elif model == 'svm':
result_list = svm(features[0], features[1])
text = "Your file " + str(result_list[0]) + "\'s predicted genre is <b style=\"color:red;\">" + str(result_list[1]) + "</b> with the model " + str(result_list[2]) + "!"
return render_template("results.html", text = text)
这是另一个编辑,经过多次测试后,我可以看到应用程序在调用 extract()
函数时崩溃。
它仍然在本地工作,所以我真的不明白为什么它不能在 heroku 上工作。
使用 app.py 中的一些 print
可以看到请求一直持续到 extract()
- 查看错误日志:
2021-06-02T01:33:20.985460+00:00 app[web.1]: moonlight.wav has been downloaded and the chosen model is logreg
2021-06-02T01:33:20.986694+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator StandardScaler from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-02T01:33:20.986696+00:00 app[web.1]: warnings.warn(
2021-06-02T01:33:20.986847+00:00 app[web.1]: /app/.heroku/python/lib/python3.9/site-packages/sklearn/base.py:310: UserWarning: Trying to unpickle estimator PowerTransformer from version 0.23.2 when using version 0.24.2. This might lead to breaking code or invalid results. Use at your own risk.
2021-06-02T01:33:20.986848+00:00 app[web.1]: warnings.warn(
2021-06-02T01:33:20.989981+00:00 app[web.1]: Analyzing file 1 of 1: uploads/moonlight.wav
2021-06-02T01:33:26.229450+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=POST path="/" host=the-mgr-project.herokuapp.com request_id=9c914ee3-3434-41e2-9d77-2d3e2c3cd21d fwd="172.58.140.104" dyno=web.1 connect=0ms service=30104ms status=503 bytes=0 protocol=https
2021-06-02T01:33:26.171668+00:00 app[web.1]: [2021-06-02 01:33:26 +0000] [4] [CRITICAL] WORKER TIMEOUT (pid:36)
2021-06-02T01:33:26.230125+00:00 app[web.1]: [2021-06-02 01:33:26 +0000] [36] [INFO] Worker exiting (pid: 36)
2021-06-02T01:33:27.043439+00:00 app[web.1]: [2021-06-02 01:33:27 +0000] [44] [INFO] Booting worker with pid: 44
答案 0 :(得分:1)
如果您的应用在本地主机上运行良好,请尝试将您的 Procfile 更改为:
web: gunicorn app:app --preload