9

Pythonを使用して、KendoUIのグリッドコンポーネントを提供するサーバー側フィルタリングの実装に取り​​組んでいます。

私が直面している問題は、デフォルトで生成されるAJAX呼び出しが、Flaskの組み込みURLパーサーとPythonのurlparseモジュールの両方と互換性がないように見えることです。

これは私が問題を抱えているクエリ文字列のタイプの考案されたサンプルです:a=b&c=d&foo[bar]=baz&foo[baz]=qis&foo[qis]=bar

これが私が目指している結果です:

{
    'a': 'b',
    'c': 'd',
    'foo': {
        'bar': 'baz',
        'baz': 'qis',
        'qis': bar'
    }
}

残念ながら、request.argsFlaskエンドポイントに渡された場合、これから得られるものは次のとおりです。

{
    'a': 'b',
    'c': 'd',
    'foo[bar]': 'baz'
    'foo[baz]': 'qis'
    'foo[qis]': 'bar'
}

さらに悪いことに、実際には、構造は数層の深さになる可能性があります。foo値がに等しい行のみに列をフィルタリングする基本的な呼び出しでは'bar'、次のようになります。

{
    'filter[logic]': 'and',
    'filter[filters][0][value]': 'bar',
    'filter[filters][0][field]': 'foo',
    'filter[filters][0][operator]': 'eq'
}

RFCを確認しましたが、クエリ文字列に「非階層」データのみが含まれている必要があります。URIが表すオブジェクトを参照していると思いますが、仕様にはこのタイプのデータ構造の規定はありません。

paramsの辞書を取り、それらが表すネストされた構造を返す関数を書き始めましたが、それが微妙な問題であり、確かに誰かが以前にこの問題を抱えていたことに気づきました。

これらのパラメーターを私が望む方法で解析するモジュール、またはおそらく見落としているエレガントな方法でこれらのパラメーターを解析するモジュールを知っている人はいますか?

4

3 に答える 3

8

これを行うための小さな関数を作成しました。

from collections import defaultdict
import re
params = {
    'a': 'b',
    'c': 'd',
    'foo[bar]': 'element1',
    'foo[baz]': 'element2',
    'foo[qis]': 'element3',
    'foo[borfarglan][bofgl]': 'element4',
    'foo[borfarglan][bafgl]': 'element5',
}

def split(string, brackets_on_first_result = False):
    matches = re.split("[\[\]]+", string)
    matches.remove('')
    return matches

def mr_parse(params):
    results = {}
    for key in params:
        if '[' in key:
            key_list = split(key)
            d = results
            for partial_key in key_list[:-1]:
                if partial_key not in d:
                    d[partial_key] = dict()
                d = d[partial_key]
            d[key_list[-1]] = params[key]
        else:
            results[key] = params[key]
    return results
print mr_parse(params)

これは、どのネストレベルでも機能するはずです。

于 2013-01-14T17:55:00.973 に答える
3

少し前に私はこのプロジェクトを見つけました:https ://github.com/bernii/querystring-parser

それは特にあなたがやりたいことをすることを目的としています。

ただし、PHPの世界以外では、GET(およびPOST)パラメーターの動作は異なります。通常のように、複数値の辞書を使用して実装されます。したがって、より良いアイデアは、それに合わせるか、両方の世界と互換性のある方法を見つけることかもしれません。

または、リクエスト本文(POST)でJSONセラル化されたデータを実際に使用し、アクセスされたリソースをコントローラー(データを渡した後に何かを実行するリソース、この場合は何かを検索するリソース)として扱うこともできます。

于 2013-01-14T18:35:35.567 に答える
0

GETリクエストで本文を送信することもできます。送信する必要があるのが階層データだけの場合は、クライアントのjson.dumps(data)とサーバーのjson.loads(data)だけかもしれません。

このようなプラクティスは、httplibのドキュメントで参照できます: http ://docs.python.org/2/library/httplib.html#httplib.HTTPConnection.request

于 2013-01-14T17:16:31.700 に答える