需要在JavaScript中引用搜索字符串,然后在Python后端解引用

0 投票
1 回答
620 浏览
提问于 2025-04-17 22:01

首先,这是我的代码。

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')

撰写回答