Flask -WTF Загрузить файл, Предварительный просмотр файла, затем Отправить файл, чтобы код Python выполнялся для этого файла. - PullRequest
0 голосов
/ 30 января 2020

TLDR; Я хочу, чтобы пользователь загрузил файл и затем просмотрел файл на странице, прежде чем подтвердить, что он хочет, чтобы этот файл был записан в базу данных.

У меня есть маршрут для моего приложение, в котором я хочу, чтобы пользователь мог:

  • загрузить файл CSV,
  • просмотреть файл CSV в виде таблицы HTML,
  • , а затем отправить CSV-файл, чтобы можно было выполнить код Python (например, pyodb c SQL запрос записывает данные файла в базу данных).

В настоящее время маршрут позволяет мне загрузить файл, предварительно просмотреть файла, и когда я нажимаю кнопку окончательной отправки, мой шаблон Jinja {% if%} работает, но файл не сохраняется после нажатия кнопки окончательной отправки. Следовательно, я не могу продолжать работать с файлом.

forms.py

class UploadForm(FlaskForm):
    var_form = FileField('Upload Variable Form')
    submit = SubmitField('Submit')
    submit_final = SubmitField('Submit')

rout.py

@app.route('/var_upload', methods=['GET', 'POST'])
def var_upload():
    upload_form = forms.UploadForm()
    var_form_data = False
    var_form_html = False
    sub_form = False
    if upload_form.var_form.data:
        var_form_data = upload_form.var_form.data
        print(request.files) # check to see if file is there

        # csv_to_html function to create HTML table from csv file

        var_form_html = csv_to_html(var_form_data)

    if upload_form.submit_final.data:
        sub_form = upload_form.submit_final.data
        # code for writing file contents to database will go here
        print(request.files) # check to see if file is there
        print('Worked!')

    return render_template("var_upload.html", upload_form=upload_form, sub_form=sub_form, var_form_data=var_form_data, tables=[var_form_html])

var_upload. html (не включая содержимое блока и таблицы данных jquery код

<div class="jumbotron">
      <h1 class="display-4">Upload</h1>
      <p class="lead">Upload Stuff</p>
      <hr class="my-4">
    {% if not var_form_data %}
      <p>
        <button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample">
            Upload Stuff
        </button>
        <a class="btn btn-primary" href="{{ url_for("var_view2") }}" role="button">
            View Stuff
        </a>
      </p>
      <div class="collapse" id="collapseExample">
        <div class="card card-body">
          <div class="custom-file">
            <form method="POST" enctype=multipart/form-data>
                {{ upload_form.hidden_tag() }}
                {{ upload_form.var_form.label }} {{ upload_form.var_form() }}
                {{ upload_form.submit()  }}
            </form>
          </div>
          <div>
            <a href="{{ url_for('static', filename='template.csv') }}" class="btn btn-link" target="_blank">Stuff Template</a>
          </div>
        </div>
      </div>
    {% endif %}

    {% if var_form_data %}
        Data to be Uploaded:
        {% for table in tables %}
        {{ table|safe }}
        {% endfor %}
        <br />
        <div align="right">
            <form method="POST" enctype=multipart/form-data>
                {{ upload_form.hidden_tag() }}
                {{ upload_form.submit_final(class_="btn btn-danger btn-lg") }}
            </form>
        </div>
    {% endif %}

    {% if sub_form %}
        <div class="alert alert-success alert-dismissible fade show" role="alert">
          <strong>Data Uploaded!</strong> Your data was successfully uploaded.
          <button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
    {% endif %}
    </div>

print(request.files) показывает, что файл не сохраняется. В конечном счете, мне нужно кнопка submit_final для отправки файла, отображаемого в виде таблицы HTML, в базу данных. Я новичок в HTTP и web dev, поэтому я уверен, что есть очевидная ошибка или решение, которое я пропускаю, но любая помощь / понимание будет с благодарностью.

Заранее спасибо!

...