使用flask表单结果生成一个URL?

时间:2017-08-03 17:54:58

标签: python python-3.x flask flask-wtforms

我正在创建一个应用程序来进行一些分析,因为用户在表单中输入了一些ID。例如,如果用户在TextField表单中键入12345, 23456,则应用程序将对这些ID运行一些分析,然后显示结果。我的问题是,当用户点击"提交"并且数据分析完成后,它始终将用户重定向到www.website.com/results。我需要创建像www.website.com/results/12345+23456这样的唯一网址,以便1)我可以拥有多个用户,2)用户可以将此链接发送给人员以重新生成分析。

现在,StackOverflow上有一些问题与我的问题类似,但它们不一样,对我没有帮助。首先,让我在讨论之前先展示一些代码。

我有一个主页,其中包含以下表单:

    <div>
 <form action="https://website.com/results/" class="form-inline" method="post">
    <div class="form-group">
    <label for="PubmedID">Pubmed ID(s)</label>
    <input type="text" class="form-control" id="PubmedID" 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> 

如您所见,表单的valuerequest.form.pmid。我的Flask-Wtform就在这里:

class pmidForm(Form):
    pmid = TextField('PubmedID')

由于此表单的action指向website.com/results,因此触发了我的Flask函数调用:

@app.route('/results/', methods=["POST"])
def results():
    form = pmidForm()
    try:
        if request.method == 'POST':

            #entry = request.form or request.data doesn't help me...
            entry = form.pmid.data #This is the user input from the form! 
            # DO LOTS OF STUFF WITH THE ENTRY 


    return render_template('results.html')

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

正如您所看到的,我正在使用POSTform.pmid.data从文本字段中获取数据。

同样,我不想重定向到/results,我想扩展一下。我尝试修改我的表单,以便form action指向https://website.com/results/{{request.form.pmid}}/,然后将结果函数更新为

@app.route('/results/<form_stuff>', methods=["POST"])
def results(form_stuff):

但这从未奏效,并会将我重新指向404未找到的页面。我认为这是有道理的,因为在首次呈现HTML时action中没有表单数据。

现在,我的另一个帖子是:Keeping forms data in url with flask,但它并没有回答或解决我的问题。对于这篇文章,人们提出的关键点是使用POST(我已经做过),并使用return request.args['query']获取并返回数据。对我来说,我已经按照自己的意愿处理了表单数据,而且我的return render_template()正是我想要的。我只需要在results URL中添加一些内容,这样对于用户放入表单的内容,它就可以是唯一的。

我需要在html和Flask /results函数中添加到表单中,以便将表单数据添加到URL中吗?如果我能提供任何其他信息以使我的问题更清楚,请告诉我。我很感激帮助!感谢

1 个答案:

答案 0 :(得分:1)

这不是关于Flask的问题。

如果您希望在提交表单时在网址中显示数据,则应使用method="get"而不是&#34;发布&#34;。然后,网址将采用https://website.com/results/?pmid=12345

的格式