URL Flask 应用程序中的参数显示 1 个表单提交延迟
URL parameter in flask app is showing up 1 form submission late
我有一个 Flask 应用程序,我试图在提交表单后向其附加 url 参数。例如,我有一个日期输入表单,如果我选择 2022-02-17 并按下按钮提交,我希望 url 然后附加 ?date=2022-02-17
。我的问题是它总是落后 1。所以在第一次提交时,它只是 ?date=
,然后如果我选择另一个不是 2022-02-17 的日期,url 将更新为 ?date=2022-02-17
。我有一个打印件,以确保日期也被正确传递到该页面的处理程序函数中。
以下是形式的神社片段:
<div class="container">
<p>{{ search_date }}</p>
<form action={{ url_for('past_releases', date=search_date) }} method="POST">
<div class="input-group justify-content-center">
<div class="form-outline">
<input class="form-control" type="date" id="searchdate" name="searchdate">
</div>
<button type="submit" class="btn btn-primary">
<i class="fa fa-search"></i>
</button>
</div>
</form>
</div>
这是处理该页面的 python 函数:
@app.route("/past-releases", methods=["GET", "POST"])
def past_releases():
"""
Search for past releases' info, based on date.
"""
search_date = None
if request.method == "GET" and request.args.get("date"):
search_date = request.args.get("date")
elif request.method == "POST":
search_date = request.form["searchdate"]
# # we use a try here for when someone might click search on the placeholder
# # date of "mm/dd/yyyy"
print(search_date)
if search_date:
try:
date_selcted = dateutil.parser.parse(search_date).strftime("%B %d, %Y")
except ParserError:
return render_template("past_releases.jinja")
pipelines_and_tasks = get_pipeline_runs_by_date(search_date)
return render_template(
"past_releases.jinja",
date_selected=date_selcted,
pipelines_and_tasks=pipelines_and_tasks,
search_date=search_date,
)
return render_template("past_releases.jinja")
我认为您应该将表单的“方法”参数替换为 GET 方法。然后不再需要 url_for
中的参数。提交表单时,所选日期会自动添加为 URL 参数。
在使用request.args
的查询中,也可以添加一个标准参数作为第二个参数,并指定参数名称类型,将参数转换为日期的函数。
下面的示例说明了所描述的可能性。
烧瓶 (app.py)
from datetime import date
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/search')
def search():
search_date = request.args.get(
'search-date',
date.today(),
type=date.fromisoformat
)
# Your filter function here.
return render_template('search.html', **locals())
HTML (templates/search.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Search</title>
</head>
<body>
<form method="get">
<input type="date" name="search-date" value="{{search_date.isoformat()}}" />
<input type="submit" />
</form>
</body>
</html>
我有一个 Flask 应用程序,我试图在提交表单后向其附加 url 参数。例如,我有一个日期输入表单,如果我选择 2022-02-17 并按下按钮提交,我希望 url 然后附加 ?date=2022-02-17
。我的问题是它总是落后 1。所以在第一次提交时,它只是 ?date=
,然后如果我选择另一个不是 2022-02-17 的日期,url 将更新为 ?date=2022-02-17
。我有一个打印件,以确保日期也被正确传递到该页面的处理程序函数中。
以下是形式的神社片段:
<div class="container">
<p>{{ search_date }}</p>
<form action={{ url_for('past_releases', date=search_date) }} method="POST">
<div class="input-group justify-content-center">
<div class="form-outline">
<input class="form-control" type="date" id="searchdate" name="searchdate">
</div>
<button type="submit" class="btn btn-primary">
<i class="fa fa-search"></i>
</button>
</div>
</form>
</div>
这是处理该页面的 python 函数:
@app.route("/past-releases", methods=["GET", "POST"])
def past_releases():
"""
Search for past releases' info, based on date.
"""
search_date = None
if request.method == "GET" and request.args.get("date"):
search_date = request.args.get("date")
elif request.method == "POST":
search_date = request.form["searchdate"]
# # we use a try here for when someone might click search on the placeholder
# # date of "mm/dd/yyyy"
print(search_date)
if search_date:
try:
date_selcted = dateutil.parser.parse(search_date).strftime("%B %d, %Y")
except ParserError:
return render_template("past_releases.jinja")
pipelines_and_tasks = get_pipeline_runs_by_date(search_date)
return render_template(
"past_releases.jinja",
date_selected=date_selcted,
pipelines_and_tasks=pipelines_and_tasks,
search_date=search_date,
)
return render_template("past_releases.jinja")
我认为您应该将表单的“方法”参数替换为 GET 方法。然后不再需要 url_for
中的参数。提交表单时,所选日期会自动添加为 URL 参数。
在使用request.args
的查询中,也可以添加一个标准参数作为第二个参数,并指定参数名称类型,将参数转换为日期的函数。
下面的示例说明了所描述的可能性。
烧瓶 (app.py)
from datetime import date
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/search')
def search():
search_date = request.args.get(
'search-date',
date.today(),
type=date.fromisoformat
)
# Your filter function here.
return render_template('search.html', **locals())
HTML (templates/search.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Search</title>
</head>
<body>
<form method="get">
<input type="date" name="search-date" value="{{search_date.isoformat()}}" />
<input type="submit" />
</form>
</body>
</html>