需要在JavaScript中引用搜索字符串,然后在Python后端解引用
首先,这是我的代码。
HTML部分
<form action= "/" onSubmit= "return validate(this);" method= "post">
<!--irrelevant from this point-->
接下来是文件中的Javascript部分
<script language= "JavaScript">
function validate(form){
if(form.text_box.value == ""){
alert("Please enter something");
return false;
}
search_string = form.text_box.value;
var encoded = encodeURIComponent(search_string).replace(/%20/g,'+');
form.action = "/search_results/" + encoded;
return true;
}
</script>
最后是Python/Flask的后端代码。
@maverick.route('/search_results/<search>', methods= ['GET', 'POST'])
def generateSearchResults(search = None):
search_string = urllib.unquote_plus(search)
我想解释一下,我在把一个字符串放进我的网址之前,想先对它进行处理,因为这个字符串里面会有斜杠。不过,当我进行搜索时,页面没有加载出来,我在网址栏看到的是这个。
http://localhost:7666/search_results/%2Fthis%2Fis%2Fmy%2Fsearch
有没有人能发现我设置中的问题?
1 个回答
1
/search_results/%2Fthis%2Fis%2Fmy%2Fsearch
这个链接打不开,是因为werkzeug路由器在内部处理时把它解码了,结果变成了 /search_results//this/is/my/search
,这和你设置的模式 /search_results/<search>
不匹配,所以就出现了404错误。
你可以用javascript把这个字符串编码两次(这样会变成 %252Fthis%252Fis%252Fmy%252Fsearch
),然后 /search_results/%252Fthis%252Fis%252Fmy%252Fsearch
就能正确映射到你的视图函数上。需要注意的是,flask会自动解码一次,所以你还需要再对 search
参数接收到的值解码一次。
另一种更简单的方法是把输入字符串作为URL查询参数传递,比如 /search?q=this/is/my/search
。要做到这一点,你需要像下面这样修改端点模式:
@maverick.route('/search_results', methods= ['GET', 'POST'])
def generateSearchResults():
search_string = request.args.get('q')