使用“操作”重定向到Flask中的动态网址时出现问题

时间:2016-08-09 01:21:15

标签: python html flask jinja2

我的应用有一个文本框和一个提交按钮。我正在尝试创建并重定向到我的应用中的动态网址,这些网址基于文本框中输入的内容。例如,用户输入'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(也在下面),并通过{传递给HTML {1}}。

render_template

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

<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)) 页面刷新即可。

我是网络开发的新手,但是如果我将该按钮硬编码到HTML中的home,则此代码可以正常工作,并且action = "website.com/results"中的<query>不会显示结果页面,我认为只需要进行一些调整即可使我的应用动态重定向并正确加载页面。现在,我不确定我错过了什么。请让我知道我要去哪里流浪。

编辑 -

现在我已经实现了一个/results/<query>函数,可以重定向到我的动态URL。此功能正确重定向,但后来我收到404错误。

handle_form

我还在HTML @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) 中修改了我的表单,转到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 / 1234)但我收到404错误。以下是我更改/results/<query>

的方法
load_results

我认为我非常接近但需要弄清楚为什么我会收到404错误。我的猜测是我正在使用“GET”错误。我在HTML中的表单使用@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 。由于这与“GET”不匹配,我的method="post"函数无法检索表单的内容吗?

编辑2 -

load_results(query)更改为使用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

有了这个,它仍然像以前一样返回404错误。我应该不使用@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" 吗?

编辑3 -

即使是非常简化的if request.method == GET也会给我404错误,所以我不确定是什么。

load_results

编辑 - 3

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

1 个答案:

答案 0 :(得分:1)

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

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

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

您遇到的更大问题是,您的appraoch无法为您提供看起来像/ results / 1234的动态结果网址。

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

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

@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
相关问题