2017-03-09 497 views
0

我需要的所有功能都是爲了從輸入中獲取ns值。 但在執行request.get.args時返回無每次 下面的代碼:(Python)燒瓶 - request.args.get返回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:是的,您希望直接發佈到'搜索',而不是從'main'重定向,因爲POST數據無法通過重定向。 –

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,它可能只是確保輸入不是空的具有必需的屬性。

此外,嘗試命名您name=""更準確,而不是使用n的名稱,實際使用name,它只是讓一切更容易理解開發它。