我对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? 我觉得我错过了一些非常基本的东西。
答案 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)的语义分离变得更加容易:)