2017-02-07 2 views
10

Я использую Dropzone.js, чтобы разрешить перетаскивание файлов CSV через веб-сайт Flask. Процесс загрузки отлично работает. Я сохраняю загруженный файл в указанную вами папку и затем могу использовать df.to_html() для преобразования dataframe в код HTML, который затем передаю в мой шаблон. Он добирается до этой точки в коде, но он не отображает шаблон и никаких ошибок не возникает. Поэтому мой вопрос: почему Dropzone.js предотвращает визуализацию?Dropzone.js предотвращает создание фляжки из шаблона рендеринга

Я также попробовал только вернуть код HTML из таблицы и не использовать render_template, но это также не работает.

INIT .py

import os 
from flask import Flask, render_template, request 
import pandas as pd 

app = Flask(__name__) 

# get the current folder 
APP_ROOT = os.path.dirname(os.path.abspath(__file__)) 

@app.route('/') 
def index(): 
    return render_template('upload1.html') 


@app.route('/upload', methods=['POST']) 
def upload(): 

    # set the target save path 
    target = os.path.join(APP_ROOT, 'uploads/') 

    # loop over files since we allow multiple files 
    for file in request.files.getlist("file"): 

     # get the filename 
     filename = file.filename 

     # combine filename and path 
     destination = "/".join([target, filename]) 

     # save the file 
     file.save(destination) 

     #upload the file 
     df = pd.read_csv(destination) 
     table += df.to_html() 

    return render_template('complete.html', table=table) 


if __name__ == '__main__': 
    app.run(port=4555, debug=True) 

upload1.html

<!DOCTYPE html> 

<meta charset="utf-8"> 

<script src="https://rawgit.com/enyo/dropzone/master/dist/dropzone.js"></script> 
<link rel="stylesheet" href="https://rawgit.com/enyo/dropzone/master/dist/dropzone.css"> 


<table width="500"> 
    <tr> 
     <td> 
      <form action="{{ url_for('upload') }}", method="POST" class="dropzone"></form> 
     </td> 
    </tr> 
</table> 

EDIT

Вот образец данных csv я отправляю:

Person,Count 
A,10 
B,12 
C,13 

Complete.html

<html> 

<body> 

{{table | safe }} 

</body> 
</html> 
+0

Ваше возвращение утверждение внутри для цикла, только первая итерация цикла будет перед возвратом. Как вы думаете, почему Dropzone.js что-то делает? JavaScript работает на клиенте, Flask и Jinja запускаются на сервере отдельно. – davidism

+0

@ давидис. Вы правы в том, что находитесь внутри цикла for. Я исправил это, обратив внимание, но все равно имею ту же проблему. Я точно не знаю, что это 'dropzone.js', но я считаю, что это связано с процессом устранения. Если я копирую этот маршрут и загружаю 'html' из чтения файла' csv' с моего жесткого диска, он отлично работает. – user2242044

+0

Что такое контент для 'complete.html'? – HassenPy

ответ

3

Dropzone.js использовать AJAX для отправки данных, поэтому он не будет отдавать управление функцией просмотра.

Существует два способа перенаправления (или создания шаблона) при полном загрузке всех файлов.

  • Вы можете добавить кнопку для перенаправления.

    <a href="{{ url_for('upload') }}">Upload Complete</a>

  • Вы можете добавить слушателя событий для автоматической переадресации страницы (с помощью JQuery).

    <script> 
    Dropzone.autoDiscover = false; 
    
    $(function() { 
        var myDropzone = new Dropzone("#my-dropzone"); 
        myDropzone.on("queuecomplete", function(file) { 
        // Called when all files in the queue finish uploading. 
        window.location = "{{ url_for('upload') }}"; 
        }); 
    }) 
    </script> 
    

В функции просмотра, добавьте if заявление, чтобы проверить, был ли метод HTTP POST:

import os 
from flask import Flask, render_template, request 

app = Flask(__name__) 
app.config['UPLOADED_PATH'] = os.getcwd() + '/upload' 

@app.route('/') 
def index(): 
    # render upload page 
    return render_template('index.html') 


@app.route('/upload', methods=['GET', 'POST']) 
def upload(): 
    if request.method == 'POST': 
     for f in request.files.getlist('file'): 
      f.save(os.path.join(app.config['UPLOADED_PATH'], f.filename)) 
    return render_template('your template to render') 
5

Ваш код делает работу. Ваш шаблон будет отображен и возвращен.

Dropzone загрузит файлы, которые вы перетаскиваете в свой браузер «в фоновом режиме». Он будет потреблять ответ от сервера и оставить страницу как есть. Он использует ответ от сервера, чтобы узнать, была ли загрузка успешной.

Чтобы увидеть это в действии:

  • Перейдите на страницу
  • Откройте ваши любимые инструменты браузер Dev; (В Firefox нажмите CTRL + SHIFT + K)
  • Выберите вкладку сети
  • Перетащите ваш CSV в панели Dropzone и обратите внимание, что запрос показывает в таблице средства разработки сети

Вот снимок экрана из моего браузера. Я скопировал ваш код, как есть, из вашего вопроса.

Screen shot of code working

Чтобы реально увидеть тонированное complete.html вам нужно будет добавить еще одну флягу конечной точки и есть способ навигации к этому.

Например: в upload1.html добавить:

<a href="{{ url_for('upload_complete') }}">Click here when you have finished uploading</a> 

в init.py изменения и добавления:

def upload(): 

    ... 

     # you do not need to read_csv in upload() 
     #upload the file 
     #df = pd.read_csv(destination) 
     #table += df.to_html() 

    return "OK" 
    # simply returning HTTP 200 is enough for dropzone to treat it as successful 
    # return render_template('complete.html', table=table) 

# add the new upload_complete endpoint 
# this is for example only, it is not suitable for production use 
@app.route('/upload-complete') 
def upload_complete(): 
    target = os.path.join(APP_ROOT, 'uploads/') 
    table="" 
    for file_name in os.listdir(target): 
     df = pd.read_csv(file_name) 
     table += df.to_html() 
    return render_template('complete.html', table=table) 
+0

Спасибо, отличный ответ. В конце концов я добавил ссылку. Нет способа автоматического рендеринга? – user2242044

Смежные вопросы