0

首先,我的代码。

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)

为了解释,我试图在将字符串放入我的 url 之前引用它,因为该字符串将包含斜杠。但是,当我进行搜索时,页面没有加载,我看到这是 url 栏。

http://localhost:7666/search_results/%2Fthis%2Fis%2Fmy%2Fsearch

有人看到我的设置有任何问题吗?

4

1 回答 1

1

/search_results/%2Fthis%2Fis%2Fmy%2Fsearch没有打开,因为 werkzeug 路由器在将其映射到视图之前在内部对其进行解码,这导致它与端点中/search_results//this/is/my/search的模式不兼容,因此出现 404 错误。/search_results/<search>

您可以使用 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')
于 2014-03-12T20:54:16.503 回答