【问题标题】:Need to quote a search string in javascript, then unquote it on the python backend需要在 javascript 中引用搜索字符串,然后在 python 后端取消引用
【发布时间】:2024-04-19 01:25:05
【问题描述】:

首先,我的代码。

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

有人发现我的设置有什么问题吗?

【问题讨论】:

  • 它可能不起作用,因为 Flask 在将 URL 映射到视图之前在内部取消引用 URL,并且 / 阻止它被映射到您的视图。您可以在 JS 中对字符串进行两次编码,然后在服务器端将其解码两次。或者,如何将字符串作为 URL 查询参数传递,例如 ?q=this/is/my/search
  • 试过查询参数的事情。不幸的是没有工作
  • 另外,当我尝试编码两次时,我只是在 url 栏中看到了两次编码的版本。
  • 对它进行两次编码对我来说有效(烧瓶服务于页面)。你能确认/search/%252Fthis%252Fis%252Fmy%252Fsearch URL 没有打开吗?另外,我在服务器端解码两次是错误的。 Flask 会自动解码一次,然后你必须再解码一次。
  • 要使查询字符串起作用,您需要从 url 模式中删除 /&lt;search&gt;,然后打开 /search?q=this/is/my/search。我很快会以详细的方式将其作为答案发布。

标签: javascript python flask urllib encodeuricomponent


【解决方案1】:

/search_results/%2Fthis%2Fis%2Fmy%2Fsearch 未打开,因为 werkzeug 路由器在将其映射到视图之前在内部对其进行解码,并导致 /search_results//this/is/my/search 与端点中的模式 /search_results/&lt;search&gt; 不兼容,因此出现 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')

【讨论】:

  • 谢谢。我真的很喜欢你的第二个建议,我的代码现在更干净了。 url 看起来有点糟糕,因为我认为 flask 会自动转义 '/' 字符,但幸运的是我不需要手动生成太多 url。
最近更新 更多