使用 'action' 重定向到 Flask 中的动态 URL 时出现问题

Problems redirecting to dynamic URLs in Flask with 'action'

我的应用有一个文本框和一个提交按钮。我正在尝试在我的应用程序中创建并重定向到动态 URLs,它们基于文本框中键入的内容。例如,用户输入'1234',点击提交,然后被带到'website.com/results/1234'。问题似乎是我的按钮的 HTML 不想将用户重定向到新的动态 URL。我将此传递给 Jinja 的 HTML。

这是我的。

用户从首页开始,就是这样定义的

@app.route("/home/", methods=["GET", "POST"])
def start():
    return render_template("dashboard.html")

Dashboard.html 有一个文本框和提交按钮(如下)。正如你所看到的,这个按钮的 action 是重定向到 {{ results_page }},其中 "results_page" 来自我的 Python 函数 load_results (也在下面)并且是使用 render_template 传递给 HTML。

<div>
<form action="{{ results_page }}" class="form-inline" method="post">
  <div class="form-group">
    <label for="PubmedID">Pubmed ID(s)</label>
    <input type="text" class="form-control" id="PubmedID" placeholder="18952863, 18269575" name="pmid" value="{{request.form.pmid}}">
  </div>
  <button type="submit" id= "myButton" class="btn btn-default" data-toggle="modal" data-target="#myModal">Submit</button>
</form>
</div> 

我的应用程序的结果页面使用用户输入来查找一些信息并显示它。

@app.route('/results/<query>', methods=["GET", "POST"])
def load_results(query):
    form = pmidForm(secret_key='super secret key')
    try:
        if request.method == 'POST':
            query = form.pmid.data #This is the user input 

            results_page = "website.com/results/"+query
            return(query)

            #do lots of stuff using the query

        return render_template('results.html', form=form, results_page = results_page)


    except Exception as e:
        return(str(e))

如果我 运行 我的应用程序是这样的,主页很好,但是当我单击 "Submit" 时,该应用程序不会接受用户输入或对其执行任何操作。 home 页面刷新。

我是 Web 开发的新手,但是如果我将按钮硬编码为 HTML 中的 action = "website.com/results" 并且不使用 [=27] 中的 <query>,则此代码可以正常工作=] 对于结果页面,我认为只需要进行一些调整就可以使我的应用程序动态重定向并正确加载页面。现在,我不确定我错过了什么。请让我知道我要去哪里迷路。

编辑 -

现在我已经实现了一个 handle_form 函数,可以重定向到我的动态 URL。此函数正确重定向,但随后出现 404 错误。

@app.route('/form/', methods=["POST"]) #handles form submission
def handle_form():
    form = pmidForm(secret_key='super secret key')
    if request.method == "POST":
        query = request.form['pmid']
    return redirect('/results/'+query)

我还在 HTML action 中编辑了我的表格以转到 /form/

<form action="website.com/form/" class="form-inline" method="post">
  <div class="form-group">
    <label for="PubmedID">Pubmed ID(s)</label>
    <input type="text" class="form-control" id="PubmedID" placeholder="18952863, 18269575" name="pmid" value="{{request.form.pmid}}">
  </div>
  <button type="submit" id= "myButton" class="btn btn-default" data-toggle="modal" data-target="#myModal">Submit</button>
</form>

有了这个,我的网站将正确重定向到 /results/<query>/(例如 /results/1234),但我收到 404 错误。这是我如何改变我的 load_results

@app.route('/results/<query>', methods=["GET"])
def load_results(query):
    form = pmidForm(secret_key='super secret key')
    try:
        if request.method == 'GET':
            query = form.pmid.data #THIS IS THE USER INPUT FROM THE FORM #referencing 'class pmidForm'
            return query

            .
            .
            #do stuff 

我认为我非常接近,但需要弄清楚为什么我会收到 404 错误。我的猜测是我使用 "GET" 不正确。我在 HTML 中的表单使用 method="post"。由于这与 "GET" 不匹配,我的 load_results(query) 函数是否无法检索表单的内容?

编辑 2 -

更改 handle_form 以使用 url_for 重定向:

@app.route('/form/', methods=["POST"]) #handles form submission
def handle_form():
    form = pmidForm(secret_key='super secret key')
    if request.method == "POST":
        query = request.form['pmid']
    return redirect(url_for('.load_results', query=query))

并将load_results改为不return"query"

@app.route('/results/<query>', methods=["GET"])
def load_results(query):
    form = pmidForm(secret_key='super secret key')
    try:
        if request.method == 'GET':
             query = form.pmid.data # This shouldn't work??
             . 
             .
             # do stuff with the variable "query"           

有了这个,它仍然像以前一样 returning 404 错误。我不应该使用 if request.method == GET 吗?

编辑 3 -

即使是非常简化的 load_results 也会给我 404 错误,所以我不确定是怎么回事。

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

编辑 - 3

似乎接受的解决方案是解决此问题的正确方法,但是我的服务器中的 uwsgi 存在问题,将其重定向到错误的位置:(

你的准时问题是 /home 路由函数还需要将 results_page url 放在模板上下文中。

results_page = "website.com/results"
return render_template("dashboard.html", results_page=results_page)

由于变量未定义,flask 正在调用表单提交时的原始端点。

您更大的问题是您的方法不会为您提供看起来像 /results/1234 的动态结果 url。

典型的做法是在处理 post 请求时在服务器端重定向;或者在客户端使用 JavaScript 获取表单数据并将浏览器位置更改为 /results/1234.

如何使用服务器端重定向处理此问题的简化版本可能如下所示。一个处理表单提交的路由和另一个显示结果的路由。您只需从一个重定向到另一个即可获得漂亮的 url.

@app.route('/form', methods=["POST"])
def handle_form():
   query = form.pmid.data #This is the user input 
   return redirect(url_for('.load_results', query=query))

@app.route('/results/<query>') *removed the method spec to handle the redirect?
def load_results(query):
    .
    .
    # do something with query