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ていません。その結果、エンドポイントのパターンと互換性がなくなり/search_results/<search>、404 エラーが発生します。

文字列を javascript で 2 回エンコードすると (結果として%252Fthis%252Fis%252Fmy%252Fsearch) /search_results/%252Fthis%252Fis%252Fmy%252Fsearch、ビュー関数に正しくマップされます。フラスコは一度自動的にデコードするので、searchパラメーターで受け取った値をもう一度デコードする必要があることに注意してください。

もう 1 つの (よりクリーンな) 方法は、入力文字列を のような 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 に答える