2017-03-09 10 views
0

私はこのウェブサイトを完成させるために、nsの値を入力してください。 しかしrequest.get.argsを実行すると毎回 ここでは、コードですNoneを返していない:(Python)Flask - request.args.get returns 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 %} 

これは私が取得していますエラーです:

RuntimeError: missing n 
は、

アドバイスをいただければ幸いです。おかげさまで

答えて

1

request.argsは、クエリ文字列の値を保持します。あなたのフォームはPOSTボディに値を送ります。

代わりにrequest.form mappingを使用するか、request.valuesを使用してください。これは、request.formrequest.argsを組み合わせて使用​​します。

また、methodの形式をGETに変更して、ブラウザが代わりにクエリ文字列に引数を配置させるようにしてください。

+0

ありがとうございます。 – tadm123

+0

また、取得するために 'request.form'を使用している場合、' {{url_for( 'main')}} 'を{{url_for( 'search')}}に変更する必要はありませんそれらの値?私が言っていることが理にかなっているかどうかは分かりません。 – tadm123

+0

@ tadm123:はい、POSTデータはリダイレクトに耐えないので、 'main'からリダイレクトしないで、' search'に直接投稿したいと思います。 –

0

これはです。実際にはという悪い考えです。

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

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

すべての最初の値がリストのインデックスを考え得るようなインデックスエラーを与えていない順番に、設定されていない場合、.get()機能を使用するとNoneを返します。

エラーが返ってきたら、あなたはValueErrorを与える方がよいでしょう。

そうでなければ、私は(とにかく)クライアント側のフォーム検証をjavascriptでやっていますが、入力が必須の属性で空でないことを確認できます。

nを名前に使用する代わりに、nameという名前を使用する代わりに、正確にname=""という名前を付けてみてください。

関連する問題