2017-10-17 12 views
0

Le but de cette application est de remplir un formulaire, d'analyser les données du formulaire, de lancer une construction, de compresser et d'envoyer cette construction à l'utilisateur.Comment rendre un modèle et envoyer un fichier simultanément avec un flacon

Tout fonctionne bien, mais je veux qu'une fois le formulaire rempli, l'utilisateur est redirigé vers une page en attente, si cela est possible bien sûr.

Ceci est mon code au moment:

def create_and_download_build(form) 
     # Some parsing in the beginning of the function, the build etc... 
     os.system('tar -zcvf build.tar.gz dist/') 
     headers = {"Content-Disposition": "attachment; filename=build.tar.gz"} 
     with open('build.tar.gz', 'r+b') as data_file: 
      data = data_file.read() 
     response = make_response(render_template('waiting.html'), (data, headers)) 
     return response 

C'est là cette fonction est déclarée, dans mon _init__.py:

@app.route('/', methods=('GET', 'POST')) 
    def index(): 
     form = MyForm() # MyForm is a class in which there is some 
         # wtform field (for example TextField) 
     if form.validate_on_submit(): # This is called once the form is validated 
      return create_and_download_build(request.form) 
     return render_template('index.html', form=form) 

Il ne fonctionne pas, je reçois cette erreur pour la ligne dans laquelle j'appelle make_response: AttributeError: 'tuple' object has no attribute 'decode'

Si je change make_response à: response = make_response((data, headers)), il chargera correctement le fichier, mais il ne rendra pas la page waiting.html.
Même si je le change en: response = make_response(render_template('waiting.html')), le modèle sera rendu, mais le fichier ne sera pas téléchargé.

Existe-t-il une méthode pour effectuer ces deux actions?

Répondre

2

Réponse courte: Non. Vous ne pouvez pas renvoyer des réponses différentes à la fois, évidemment.

La solution rapide et sale serait de retourner la réponse HTML avec votre modèle "waiting.html", et à partir de ce modèle ajouter un peu de javascript pour lancer le téléchargement. NB: ceci n'a rien à voir avec le flacon BTW, vous auriez le même comportement avec n'importe quel langage/techno côté serveur. C'est juste comment fonctionne HTTP.