Flask - 如何将查询字符串参数添加到路由参数中

时间:2015-06-09 21:25:21

标签: flask query-string friendly-url

我对Flask非常新,其中一个起始要求是我需要SEO友好的网址 我有一条路线,比如说

@app.route('/sales/')
@app.route(/sales/<address>)
def get_sales(addr):
  # do some magic here
  # render template of sales

和提交地址的简单GET表单。

<form action={{ url_for('get_sales') }}> 
 <input type='text' name='address'>
 <input type=submit>
</form>

在表单提交时,请求转到/ sales /?address = somevalue而不是标准路由。我有什么选择让表单提交到/ sales / somevalue? 我觉得我错过了一些非常基本的东西。

3 个答案:

答案 0 :(得分:1)

您需要使用JavaScript来实现此目标,以便您的模板成为:

<input type='text' id='address'>
 <button onclick="sendUrl();">submit</button>


<script>
    function sendUrl(){
        window.location.assign("/sales/"+document.getElementById("address").value);
    }
</script>

和您的路线类似于之前:

@app.route('/sales/')
@app.route('/sales/<address>')
def get_sales(address="Nowhere"):
  # do some magic here
  # render template of sales
  return "The address is "+address

但是,这不是做这种事情的最好方法。另一种方法是让烧瓶提供数据,并在javascript中使用single-page-application framework来处理来自用户界面的路径。

答案 1 :(得分:1)

提交表单时发出的请求与返回的响应之间存在差异。保持查询字符串不变,因为这是与表单交互的常规方式。当您收到查询时,请对其进行处理,然后重定向到您要向用户显示的网址。

@app.route('/sales')
@app.route('/sales/<address>')
def sales(address=None):
    if 'address' in request.args:
        # process the address
        return redirect(url_for('sales', address=address_url_value)

    # address wasn't submitted, show form and address details

答案 2 :(得分:0)

我不确定是否有办法像这样访问查询字符串。路径装饰器仅适用于基本URL(减去查询字符串)

如果您想要路由处理程序中的地址,那么您可以像这样访问它:

request.args.get('address', None)

并且您的路由处理程序看起来更像:

@pp.route('/sales')
def get_sales():
    address = request.args.get('address', None)

但如果我要加2美分,您可能希望使用POST作为表单发布的方法。它使得从Web服务器(GET)获取数据和将数据发送到Web服务器(POST)的语义分离变得更加容易:)