Отправить файл с колбой и вернуть данные без обновления HTML-страницы - PullRequest
0 голосов
/ 27 апреля 2018

Я разрабатываю веб-приложение, которое принимает данные в градациях серого и возвращает цветную версию этого изображения с помощью машинного обучения. Для этого в веб-приложении есть серверная часть Python, связывающая внешние HTML-страницы с помощью микросхемы Flask.
Я отправляю изображение, которое я выбрал для обработки в python, а затем возвращаю имя изображения, чтобы отобразить его из своего каталога. У меня вопрос, как я могу сделать предыдущие операции без перезагрузки HTML-страницы?

1 Ответ

0 голосов
/ 28 апреля 2018

Я сделал минимальный рабочий пример, который делает именно то, что вы просите:

from flask import Flask, render_template_string, request, jsonify, url_for
import os
from werkzeug.utils import secure_filename

if not os.path.isdir("/static"):  # just for this example
    os.makedirs("/static")

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        file = request.files['file']
        fname = secure_filename(file.filename)
        file.save('static/' + fname)
        # do the processing here and save the new file in static/
        fname_after_processing = fname
        return jsonify({'result_image_location': url_for('static', filename=fname_after_processing)})

    return render_template_string('''
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>title</title>
</head>
<body>
<form enctype="multipart/form-data" method="post" name="fileinfo">
  <label>Some user provided information</label>
  <input type="text" name="some_info" size="12" maxlength="32" /><br />
  <label>File to upload:</label>
  <input type="file" name="file" required />
  <input type="submit" value="Upload the file!" />
</form>
<img id="resultimg" scr="">
<div></div>
<script>
var form = document.forms.namedItem("fileinfo");
form.addEventListener('submit', function(ev) {
  var oData = new FormData(form);
  var oReq = new XMLHttpRequest();
  oReq.open("POST", "{{url_for('index')}}", true);
  oReq.onload = function(oEvent) {
    if (oReq.status == 200) {
      document.getElementById('resultimg').setAttribute('src', JSON.parse(oReq.responseText).result_image_location);
    } else {
      alert("Error " + oReq.status + " occurred when trying to upload your file")
    }
  };
  oReq.send(oData);
  ev.preventDefault();
}, false);
</script>
</body>
</html>
''')


app.run()

Я не проверяю расширения файлов и не перезаписываю файлы, поэтому вам следует защитить эту функцию немного больше. Но базовая инфраструктура есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...