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

Flask - how to get query string parameters into the route parameters

我是 Flask 的新手,开始的要求之一是我需要 SEO 友好的 url。
我有一条路线,说

@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? 我觉得我缺少一些非常基本的东西。

我不确定有没有办法像那样访问查询字符串。路由装饰器仅适用于基础 url(减去查询字符串)

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

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

你的路由处理程序看起来更像:

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

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

您需要使用 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

然而,这并不是做这种事情的最佳方式。另一种方法是让 Flask 提供数据并使用 javascript 中的 single-page-application framework 从用户界面的角度处理路由。

提交表单时的请求和返回的响应是不一样的。保持查询字符串不变,因为这是与表单交互的正常方式。当您收到查询时,处理它然后重定向到您要向用户显示的 url。

@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