2016-11-05 7 views
1

wirklich mit dieser schlechten Anfrage von Kolben zu kämpfen. Ich weiß normalerweise, dass es verursacht hat, dass flash nicht den [key] in der Form findet. Allerdings habe ich meinen form und python Code 40 Mal überprüft und kann keinen Grund sehen, dass das der Fall wäre. Ich habe jede Zeile auskommentiert Der Python-Code, der request.form referenziert. Ich habe es 1 zu 1 gemacht und bekomme immer noch eine schlechte Anfrage. Wenn ich jedoch alle Zeilen auskommentiere, verschwindet die schlechte Anfrage. Jeder Gedanke wäre wunderbar.Schlechte Anfrage mit Kolben

Python-Code;

if request.method == 'POST': 
    form = 'Add Package Form' 
    clientId = request.form['id'] 
    date = request.form['date2'] 
    strPrice = request.form['price'] 
    price = float(strPrice) 
    adultlessons = request.form['adult'] 
    juniorlessons = request.form['junior'] 
    shortlessons = request.form['short'] 
    playinglessons = request.form['playing'] 
    notes = request.form['notes'] 

Form ..

<form action="/addpackage" method="post" class="sky-form"> 
       <fieldset> 
       <section> 
        <label class="label">Select Package Date</label>  
        <label class="input"> 
         <i class="icon-append fa fa-calendar"></i> 
         <input type="text" name="date2" id="date"> 
        </label> 
       </section> 
       <div style="margin: -25px"></div> 
      <fieldset> 
       <section> 
        <label class="label">Price</label> 
        <label class="input"> 
         <input type="text" name="price"> 
        </label> 
       </section> 
       <section> 
        <label class="label">Adult Lessons</label> 
        <label class="input"> 
         <input type="text" name="adult"> 
        </label> 
       </section> 
       <section> 
        <label class="label">Junior Lessons</label> 
        <label class="input"> 
         <input type="text" name="junior"> 
        </label> 
       </section> 
       <section> 
        <label class="label">Short Game Lessons</label> 
        <label class="input"> 
         <input type="text" name="short"> 
        </label> 
       </section> 
       <section> 
        <label class="label">Playing Lessons</label> 
        <label class="input"> 
         <input type="text" name="playing"> 
        </label> 
       </section> 
       <section> 
        <label class="label">Notes</label> 
        <label class="textarea textarea-expandable"> 
         <textarea rows="3" name="notes"></textarea> 
        </label> 
        <div class="note"><strong>Note:</strong> expands on focus.</div> 
       </section> 
      </fieldset> 
       </fieldset> 
      <!-- hidden client id --> 
      <input type="hidden" name="id" value="{{ client.id }}"> 
      <!-- /hidden client id --> 
      <footer> 
       <button type="submit" name="addpackage" value="package" class="button">Add Package</button> 
      </footer> 
     </form> 

Antwort

1

Das ist etwas, von einer Halb Antwort, aber es war zu lang für einen Kommentar.

Wenn Sie das Debugging in Ihrer Flask-App aktivieren, sollten Sie eine detaillierte Rückverfolgung erhalten, die genau angibt, wo das Problem auftritt (sowohl im Browser als auch auf Ihrer Konsole).

Wenn Ihre Anwendung hat derzeit so etwas wie:

app.run() 

Nur stellen Sie die debug Parameter true:

app.run(debug=True) 

Wenn nach dem Aktivieren Sie noch nicht sicher Debuggen sind, was das Problem verursacht, zu aktualisieren Ihre Frage, um die Rückverfolgung einzuschließen.

Für das, was es wert ist, wenn ich Ihre Form und Ihren Code in eine einfache Flasche App-Dump, es scheint alles ganz gut, so lange zu arbeiten, wie ich einen numerischen Wert für das price Feld bereitzustellen.

+1

Dank .. Ich habe eigentlich .. ein creatapp() Func und dann tun .. app = creatapp() I app.debug = True, in createapp haben(), aber ich sehe nicht ein detaillierte Ablaufverfolgung in der Konsole? In anderen Nachrichten .. Es entfernte ich das 'Textarea' und machte es nur ein Eingabefeld und es funktioniert jetzt .. nicht sicher, warum das einen Unterschied tho machen würde? –

1

Normalerweise erhalten Sie eine 400 Bad Request in Flask beim Absenden eines Formulars, wenn Sie versuchen, auf einen Formularschlüssel im request Objekt zuzugreifen, das nicht existiert.

Dies ist, weil das Objekt seiner request.form__getitem__ Verfahren die Multidict Klasse im werkzeug.datastructures Modul erbt die ein BadRequestKeyError when a key doesn't exist aufwirft.

0

Sie sollten die Formulardaten einen Standardwert geben HTTP 400-Fehler zu vermeiden, wie folgt aus:

name = request.form["name"] or "" 

oder:

default_value = True 
is_public = request.form.get('public', default_value) 

Allerdings empfehle ich Ihnen Flask-WTF zu verwenden.
mit Kolben-WTF, kann Ihr Code (ein Beispiel) zu dieser Vereinfachung sein:

import ... 
app = Flask(__name__) 

class EditProfileForm(Form): 
    name = StringField('name', validators=[Length(0, 64)]) 
    location = StringField('city', validators=[Length(0,64)]) 
    website = StringField('website', validators=[Length(0,64), render_kw={"placeholder": "http://..."}) 
    about_me = TextAreaField('Bio', validators=[Length(0,2000)], render_kw={"placeholder": "I'm......"}) 
    submit = SubmitField(u'submit') 

@app.route('/edit-profile', methods=['GET', 'POST']) 
def edit_profile(): 
    form = EditProfileForm() 
    if form.validate_on_submit(): 
     current_user.name = form.name.data 
     current_user.location = form.location.data 
     current_user.website = form.website.data 
     current_user.about_me = form.about_me.data 
     db.session.add(current_user) 
     flash('Update success!', 'success') 
     return redirect(url_for('.user', username=current_user.username)) 
    return render_template('edit_profile.html', form=form) 

in Ihrer HTML-Datei:

<form method="POST" action="/"> 
    {{ form.hidden_tag() }} 
    {{ form.name.label }} {{ form.name() }} 
    {{ form.location.label }} {{ form.location() }} 
    ... 
</form> 

By the way, wenn Sie Flask-Bootstrap verwenden, können Sie einfach Verwenden Sie eine Zeile, um das ganze Formular zu rendern:

{% import "bootstrap/wtf.html" as wtf %} 
{{ wtf.quick_form(form) }} 

Ich hoffe, es wird Ihnen helfen.