【问题标题】:Using flask form result to generate a URL?使用烧瓶表单结果生成 URL?
【发布时间】:2017-08-03 17:54:57
【问题描述】:

假设用户在表单中输入了一些 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 中添加一些内容,以便用户在表单中输入的任何内容都可以是唯一的。

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

【问题讨论】:

  • 我会散列组合的 id 并将其用作保存结果的 PK。
  • @Dan 你能扩展一下吗?用什么散列组合的 id?一个特定的python库?还有你说的“PK”是什么意思?
  • 将结果保存到 DB,然后重定向到 /results/id,其中 id 是结果的 PK。您还可以使用查询字符串参数 /results/?id=1&id=2 然后在数据库中查找 id 的哈希值。

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


【解决方案1】:

这不是关于 Flask 的真正问题。

如果您希望数据在提交表单时显示在 URL 中,您应该使用method="get" 而不是“post”。然后 URL 将采用https://website.com/results/?pmid=12345 的形式。

【讨论】:

  • 这似乎与stackoverflow.com/questions/20885937/… 中讨论的完全相反,后者建议使用post。你能解释一下我的情况有什么不同吗?我认为我还需要post 来处理结果函数中的表单数据。我会尝试get 看看,但flask-wtforms 与post 一起使用,因为我一直使用它。
  • 更新 - 你是正确的“获取”附加信息到 URL,但这会导致 405“请求的 URL 不允许该方法”。那么我需要在@app.route() 中添加一些东西吗?
  • 更新——我认为“get”不适用于 wtforms。我将所有内容都更改为“get”,如果我检查表单数据,它是“None”和“NoneType”类。也许那时我会更改为 request.arg?
  • 最终更新——我将表单方法更改为“get”,并将/results中的方法更改为“get”,然后以entry = (request.args.getlist('pmid'))[0]访问数据
  • 这个线程似乎对解决我自己的代码问题很有帮助。但是,我不知道使用什么条件来处理路由中的表单。我一直在使用if form.validate_on_submit(): 在相关代码行之前,但这仅适用于 POST 方法。如果我更改为if request.method == 'GET',它会使我的 else 语句变得多余,因为这也使用了 GET 方法。当使用 GET 方法提交表单时,我可以使用其他条件吗?
猜你喜欢
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多