2017-10-16 12 views
-2

Salut, je suis nouveau à python flask, j'ai ce qui semble être un simple problème d'une erreur 400 mauvaise demande, qui devrait être dû à avoir mal nommé les variables dans la forme lorsque vous essayez de les transmettre à une fonction en flacon de python. J'ai fait quelques recherches mais je ne peux toujours pas comprendre où je vais mal avec ce code, toute aide serait vraiment appréciée. Voici le code pour le formulaire html400 Bad Request flacon python

<html> 
<body> 

    <h1>Add a Munroe to your list</h1> 
    <form action = "{{ url_for('addmunro') }}" method="POST" 
     enctype = "multipart/form-data"> 

     Name<br> 
     <input type="text" name="mnName"/><br> 
     Description<br> 
     <input type="text" name="mnDesc"/><br> 
     Region<br> 
     <input type="text" name="mnRegion"/><br> 
     Height<br> 
     <input type="text" name="mnHeight"/><br> 
     Walk date<br> 
     <input type="text" name="mnDate"/><br> 
     Walk image<br> 
     <input type="text" name="mnImage"/><br> 

     <br> 
     <br> 
     <input type="submit" name="add-munro.html" value = "ADD MUNRO"/> 

    </form> 
</body> 
</html> 

Et voici le code pour l'application flacon de python

 from flask import Flask, render_template, url_for, redirect, json, request 
app = Flask(__name__) 

@app.route('/add-munro.html', methods=['GET']) 
def addmunro(): 


    #Create an empty list 
    mnList={} 

    #Create a munro dictionary 
    munro = {'name':request.form['mnName'], 
      'desc':request.form['mnDesc'], 
      'region':request.form['mnRegion'], 
      'height':request.form['mnHeight'], 
      'date':request.form['mnDate'], 
      'image':request.form['mnImage']} 

    #the munro dictionary is added to mnList 
    #mnList.append(munro) 

    return render_template('add-munro.html') 


if __name__ == "__main__": 
    app.run(host = '0.0.0.0', debug = True) 

Répondre

0

Il y a plusieurs erreurs:

  1. Vous faites la demande POST, mais la manipulation seule requête GET
  2. .html n'est pas nécessaire de routage
  3. objet munro n'est pas passé au modèle

J'ai mis à jour ceux-ci et maintenant il est bon d'aller:

application.py

from flask import Flask, render_template, request, url_for 

app = Flask(__name__)  

@app.route('/add-munro', methods=['GET','POST']) 
def addmunro(): 
    if request.method == "POST": 
     #Create an empty list 
     mnList={} 
     #Create a munro dictionary 
     munro = {'name':request.form['mnName'], 
       'desc':request.form['mnDesc'], 
       'region':request.form['mnRegion'], 
       'height':request.form['mnHeight'], 
       'date':request.form['mnDate'], 
       'image':request.form['mnImage']} 
     return render_template('add-munro.html', munro=munro) 
    else: 
     return render_template('add-munro.html') 

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

add-munro.html

<html> 
<body> 
    {% if munro is defined -%} 
    <h3> 
     Name: {{ munro.name }} 
    </h3> 
    <h3> 
     Description: {{ munro.desc }} 
    </h3> 
    <h3> 
     Region: {{ munro.region }} 
    </h3> 
    <h3> 
     Height: {{ munro.height }} 
    </h3> 
    {%- endif %} 
    <h1>Add a Munroe to your list</h1> 
    <form action = "{{ url_for('addmunro') }}" method="POST" 
    enctype = "multipart/form-data"> 

    Name<br> 
    <input type="text" name="mnName"/><br> 
    Description<br> 
    <input type="text" name="mnDesc"/><br> 
    Region<br> 
    <input type="text" name="mnRegion"/><br> 
    Height<br> 
    <input type="text" name="mnHeight"/><br> 
    Walk date<br> 
    <input type="text" name="mnDate"/><br> 
    Walk image<br> 
    <input type="text" name="mnImage"/><br> 

    <br> 
    <br> 
    <input type="submit" value = "ADD MUNRO"/> 
</form> 
</body> 
</html> 

Sortie:

enter image description here

+0

Merci pour l'explication, je dois aussi télécharger une image dans le cadre du dictionnaire, je sais que je dois changer le type de fichier dans le HTML, mais comment puis-je enregistrer dans le dictionnaire dans l'application flacon? – costep

+0

Vous ne pouvez pas enregistrer le fichier dans le dictionnaire. Mais vous pouvez certainement enregistrer le fichier dans un répertoire, puis enregistrez le chemin dans le dictionnaire. Utilisez 'image = request.files [" mnImage "]' pour obtenir le fichier dans le contrôleur, puis enregistrez-le dans un répertoire en utilisant 'image.save()'. Enfin, vous pouvez retourner le chemin de l'image dans le dictionnaire. – arsho

1

Vous faites une demande POST dans votre formulaire, mais permettent seulement la méthode GET dans votre itinéraire d'application. Remplacez @app.route('/add-munro.html', methods=['GET']) par @app.route('/add-munro.html', methods=['POST']).