我需要完成此网站,以便从输入中获取n
和s
值。
但是当执行request.get.args
时每次都返回None
这是代码:
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
任何建议都将不胜感激。 感谢。
答案 0 :(得分:2)
request.args
保存查询字符串中的值。另一方面,您的表单是在POST正文中发送值。
改为使用request.form
mapping,或使用request.form
和request.args
组合的request.values
。
或者,将表单method
更改为GET
,让浏览器将参数放在查询字符串中。
答案 1 :(得分: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
,这只会让您更容易理解开发它。
答案 2 :(得分:-1)
尝试一下:
request.get_data()
它返回字典对象。