使用表单发布请求,然后能够保存它在单独请求中返回的数据

时间:2014-05-27 13:05:59

标签: python python-2.7 flask

假设我有一个这样的表格

<form role="form">
  <div class="form-group">
    <label for="exampleInputEmail1">Email address</label>
    <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email">
  </div>
  <div class="form-group">
    <label for="exampleInputPassword1">Password</label>
    <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
  </div>
</form>

然后我有一个相当通用的路由,通过静态文件

进行排序
@app.route('/search/properties/', methods=['GET', 'POST'])
def properties_search():
  form = request.form
  if request.method == 'POST':
    properties = CSVReader('properties.csv')
    d = [x._asdict() for x in properties.data]
    gen = stream_with_context(search_csv(d, form))
    return Response(stream_with_context(
      stream_template('advanced_search/results.html', form=form, rows=gen)
    ))
  return render_template('advanced_search/advanced.html', form=form)

这将呈现一个包含我正在寻找的结果的页面 - 而且一切都很顺利。但是,在页面上,我还想添加以CSV格式下载数据的功能。

| download csv | | return to search |
- result 1
- result 2
...

我遇到的问题是,在发布请求之后,我需要一些方法来了解他们在应用程序上的最后一次表单请求。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

没有单一的最佳方式&#34;做到这一点,因为最好的&#34;在您的具体情况下可能不适合另一种情况。话虽这么说,下面是几种可能的方式(它们几乎不会划掉你需要做的事情以使它们能够生产就绪)并且还有很多甚至更多。

你真的需要自己研究这些选项;你所拥有的场景并不是特定于python或flask,对于构建需要记住状态的HTTP应用程序的人来说,这几乎是一个问题!

在隐藏的输入中呈现接收的表单值

  • 渲染初始搜索结果时。渲染&#34;下载CSV&#34;作为表单的submit输入,将这些值发布回下载渲染器。

      

    我不会成为这个的忠实粉丝,因为它需要一个按钮和一个POST,当你真的在寻找GET时,如果你真的需要密码才能呈现结果,那么它就是sa安全问题。

  •   

     

在呈现初始搜索结果页面时,渲染&#34;下载CSV&#34;的链接。这样它包含某种会话ID。

  • 当您收到表单的初始POST以生成搜索结果时。取email并将其存储在数据库表(或其他一些持久存储机制)中,记录由此操作产生的某种生成的ID。您还可以保存用户提交的任何其他搜索参数等。

  • ID成为&#34;下载为CSV&#34;的链接的查询字符串参数。即,当您的模板呈现初始搜索页面时,该链接最终会像"http://blahblah.com/download?ID=12345"

  • 一样
  • 当用户请求链接时,根据查询字符串ID参数从数据库中查找搜索/用户信息,然后将其传递给将为您呈现CSV的任何模板。< / p>

  • 这种方法有很多种,你需要为你的场景选择最好的 - 你可以保存重播的搜索条件,或保存实际的搜索结果,这取决于搜索的性质,它有多贵运行以及是否&#34;下载为CSV&#34;必须重播搜索或返回最初获得的确切结果等),你还需要加强它。不要发送原始数据库ID - 发送它们的散列/加密版本,以便用户无法猜测&#34;下载ID等
  

我建议采用这种方法,因为它根本不要求您将用户名/密码返回给客户端。

希望这能让你思考:)