2017-03-09 5 views
0

Alles, was ich brauche, um diese Website zu vervollständigen, ist es, die n und s Werte von dem Eingang zu greifen. Aber wenn request.get.args Ausführung kehrt Keine jedes Mal Hier ist der Code:(Python) Flask - request.args.get Rückgabe NoneType

my_website.py:

import sqlite3 
from flask import Flask,render_template, url_for, redirect, request 


app = Flask(__name__) 
conn = sqlite3.connect('shoes.db', check_same_thread=False) 
c = conn.cursor() 

@app.route("/", methods=["GET", "POST"]) 
def main(): 

    if request.method == 'GET': 
     return render_template('main.html') 

    elif request.method == 'POST': 
     return redirect(url_for('search')) 


@app.route("/search/", methods=["GET", "POST"]) 
def search(): 

    if not request.args.get("n"):   
     raise RuntimeError("missing n") 

    if not request.args.get("s"): 
     raise RuntimeError("missing s") 

    name = request.args.get('n') 
    size = request.args.get('s') 
    c.execute("SELECT * FROM shoes WHERE name LIKE ? AND sizes LIKE ? ORDER BY price", 
        ('%'+name+'%','%'+size+'%')) 

    p = c.fetchall() 

    url = [p[i][0] for i in range(len(p))] 
    names = [p[i][1] for i in range(len(p))] 
    prices = [p[i][2] for i in range(len(p))] 
    sizes = [p[i][3] for i in range(len(p))] 
    shoe_type = [p[i][4] for i in range(len(p))] 

    return render_template('search.html' , url=url, names=names, prices=prices, 
          sizes=sizes, shoe_type=shoe_type) 


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

main.html:

{% extends "layout.html" %} 
{% block content %} 

<form action = "{{ url_for('main') }}" class="form" method = "POST" > 
    <div> 
     <h1>Soccer Shoes Finder</h1> 
     <div class="line-separator"></div> 
     <div> 
      <div class="container-fluid"> 
       <input name = "n" type="text" placeholder="Name"/> 
       <input name = "s" type="text" placeholder="Size"/> 
       <button class="glyphicon glyphicon-search" aria-hidden="true"></button> 
      </div> 
     </div> 
</form> 

{% endblock %} 

Dies ist der Fehler, ich bin immer:

RuntimeError: missing n 

Jeder Rat würde geschätzt werden. Danke.

Antwort

1

request.args enthält die Werte in der Abfragezeichenfolge. Auf der anderen Seite sendet Ihr Formular Werte im POST-Body.

Verwenden Sie die request.form mapping stattdessen oder verwenden request.values, die request.form und request.args kombiniert.

Alternativ können Sie das Formular method in GET ändern, damit der Browser die Argumente stattdessen in die Abfragezeichenfolge eingibt.

+0

Ich sehe, vielen Dank. – tadm123

+0

Ich würde auch nicht '{{url_for ('main')}}' in '{{url_for ('search')}}' ändern müssen, wenn ich 'request.form' benutze diese Werte? Ich weiß nicht, ob das, was ich sage, Sinn macht. – tadm123

+0

@ tadm123: Ja, Sie möchten direkt zu 'suchen' posten, nicht von' main' umleiten, da POST-Daten eine Weiterleitung nicht überleben. –

0

Dies ist ein wirklich schlechte Idee.

if not request.args.get("n"):   
     raise RuntimeError("missing n") 

    if not request.args.get("s"): 
     raise RuntimeError("missing n") 

Zunächst einmal wird wieder None die .get()-Funktion, wenn der Wert nicht gesetzt ist, wiederum nicht wie ein Indexfehler geben würde einen Listenindex zu bekommen.

Wenn Sie die Hölle sind, einen Fehler zurückzugeben, ist es besser, eine ValueError zu geben.

Sonst würde ich tun (und wahrscheinlich sollte sowieso) clientseitige Form Validierung mit Javascript, könnte es nur sicherstellen, dass die Eingänge nicht mit einem erforderlichen Attribut leer sind.

Versuchen Sie auch, name="" genauer zu benennen, anstatt n für Name zu verwenden, verwenden Sie tatsächlich name, macht es einfach alles viel einfacher zu verstehen, es zu entwickeln.

Verwandte Themen