【问题标题】:How to create dynamic route in Flask after form submit?表单提交后如何在Flask中创建动态路由?
【发布时间】:2021-05-11 01:51:22
【问题描述】:

我不明白如何仅在用户提交表单后在 Flask 中创建动态路由。下面的代码有效,但我只希望在提交表单后可以访问/search/<query>。使用我当前的代码,我仍然可以通过在浏览器中输入 /search/any-search-query 来访问该页面。

这是我正在做的事情:

1 - 这是表单的 POST 请求。

@app.route('/submit', methods=['POST'])
def submit():
    if request.method == 'POST':
        s = request.form['search']
        return redirect(url_for('results', query=s))
    else:
        redirect(url_for('index'))

2 - 当用户提交表单时,将他们重定向到具有动态路由的新页面。

@app.route('/search/<query>', methods=['GET'])
def results(query):
    return render_template("results.html")

3 - 这是我的 HTML 文件中的表单。

<form action="{{ url_for('submit') }}" method="POST">
    <input type="search" id="search" name="search" placeholder="Search">
    <button>Submit</button>
</form>

【问题讨论】:

  • 使用 cookie 或烧瓶会话
  • @waynetech 你能举个例子吗?

标签: forms flask jinja2 flask-wtforms


【解决方案1】:

我们可以直接向另一个页面发送 GET 请求。

所以在你的模板中:

<form action="{{ url_for('results') }}" method="GET">
    <input type="search" id="query" name="query" placeholder="Search">
    <button>Submit</button>
</form>

在你的results 路由中:

from flask import request

@app.route('/search')
def results():
    query = request.args.get("query")
    # ...
    return render_template("results.html")

注意,如果你想直接进入结果页面,你需要输入localhost:5000/search?query=any-search-query而不是/search/any-search-query

【讨论】:

  • 我试图避免让用户通过localhost:5000/search?query=any-search-query 进行搜索。如何确保他们只通过搜索表单访问该页面?
【解决方案2】:

这是我正在尝试的方法,但我不知道这是否是一个干净的解决方案。

from flask import session
@app.route('/submit', methods=['POST'])
def submit():
    session['search'] = 'yes' # assign session value
    if request.form:
        s = request.form['search']
        return redirect(url_for('results', query=s))
    else:
        redirect(url_for('index'))

然后更新

@app.route('/search/<query>', methods=['GET'])
def results(query):
    if session['search'] == 'yes':
        session['search'] = 'no' # assign new value to session
        return render_template("results.html")
    else:
        return redirect(url_for('index'))

【讨论】:

  • 只需使用session.get('search') 而不是session['search'],否则当有人绕过表单键入/search?query=any-search-query 时,您的应用可能会崩溃。休息看起来不错
  • @waynetech 好的,谢谢。让我试试这个。
猜你喜欢
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
相关资源
最近更新 更多