1. ホーム
  2. パイソン

Django はフロントエンドのデータをいくつかの方法で受け取ります。

2022-02-22 12:35:33
<パス

フィリピン猿は本当に面白い、国際的に叩かれ放題、何がデタラメ判決だ、中国のものは中国のもの、祖国の領土は神聖不可侵だ。

背景

テストツールキットを書いている途中で、今日はフロントエンドとバックエンドのデータのやり取りの問題にぶつかったので、少し整理してみました。

環境について


バージョン関連

OS:Mac OS X EI Caption

Pythonバージョン: 2.7

IDEです。PyCharm

Django 1.8.2


注)テストしたのは Get メソッドを使用します。 POST メソッドもまた

文字タイプ

文字系データは比較的よく取得され、以下のようにフロントエンドで渡されます。

sendData = { "exporttype": exporttype,

    "bugids": bugids,

    "test": JSON.stringify({
"test": "test"})

};

Django のバックエンドでは、単に exporttype = request.GET.get("exporttype")
そして、このデータをきちんと取得することができるようになるのです。

Python 2.7 のデータは unicode を使用する場合、変換が必要な場合があります。 str

結果例

Excle <type 'unicode'>

配列タイプ

配列型データの取得 文字列型データの取得メソッドを使用すると、結果が None になってしまいますので、このメソッドを使用したいと思います。

bugids = request.GET.getlist("bugids[]")

この方法で取得したデータは、配列型です。

注)取得した配列の要素は unicode エンコードされているため、ある時点でトランスコードする必要があります。

結果例

  • 渡されたurl
[14/Jul/2016 11:00:41]"GET /testtools/exportbug/?exporttype=Excle&bugids%5B%5D=102&bugids%5B%5D=101&bugids%5B%5D= 100&bugids%5B%5D=99&bugids%5B%5D=98&bugids%5B%5D=97&bugids%5B%5D=96&bugids%5B%5D=95&bugids%5B%5D=94& bugids%5B%5D=93&bugids%5B%5D=92&bugids%5B%5D=91&bugids%5B%5D=90&bugids%5B%5D=89&bugids%5B%5D=88&bugids%5B%5D=89&bugids%5B%5D=88&bugids%5B 5D=87&bugids%5B%5D=86&bugids%5B%5D=85&bugids%5B%5D=84&bugids%5B%5D=83&bugids%5B%5D=82&bugids%5B%5D=81& bugids%5B%5D=80&bugids%5B%5D=79&bugids%5B%5D=78&bugids%5B%5D=77&bugids%5B%5D=76&bugids%5B%5D=75&bugids%5B%5D=75&bugids%5B 5D=74&bugids%5B%5D=73&bugids%5B%5D=72&bugids%5B%5D=71&bugids%5B%5D=70&bugids%5B%5D=69&bugids%5B%5D=68& bugids%5B%5D=67&bugids%5B%5D=66&bugids%5B%5D=65&bugids%5B%5D=64&bugids%5B%5D=63&bugids%5B%5D=62&bugids%5B%5D=63&bugids%5B%5D=63&bugids%5B%5D=62&bugids%5B 5D=61&bugids%5B%5D=60&bugids%5B%5D=59&bugids%5B%5D=58&bugids%5B%5D=57&bugids%5B%5D=56&bugids%5B%5D=55& bugids%5B%5D=54&bugids%5B%5D=53&bugids%5B%5D=52&bugids%5B%5D=51&bugids%5B%5D=50&bugids%5B%5D=49&bugids%5B%5D=49&bugids%5B 5D=48&bugids%5B%5D=47&bugids%5B%5D=46&bugids%5B%5D=45&bugids%5B%5D=44&bugids%5B%5D=43&bugids%5B%5D=42& bugids%5B%5D=41&bugids%5B%5D=40&bugids%5B%5D=39&bugids%5B%5D=38&bugids%5B%5D=37&bugids%5B%5D=36&bugids%5B%5D=36&bugids%5B 5D=35&bugids%5B%5D=34&bugids%5B%5D=33&bugids%5B%5D=32&bugids%5B%5D=31&bugids%5B%5D=30&bugids%5B%5D=29& bugids%5B%5D=28&bugids%5B%5D=27&bugids%5B%5D=26&bugids%5B%5D=25&bugids%5B%5D=24&bugids%5B%5D=23&bugids%5B%5D=24&bugids%5B%5D=24&bugids%5B%5D=23&bugids%5B 5D=22&bugids%5B%5D=21&bugids%5B%5D=20&bugids%5B%5D=19&bugids%5B%5D=18&bugids%5B%5D=17&bugids%5B%5D=16& bugids%5B%5D=15&bugids%5B%5D=14&bugids%5B%5D=13&bugids%5B%5D=12&bugids%5B%5D=11&test=%7B%22test%22%3A%22test% 22%7D HTTP/1.1"

  • 取得したデータ
[u'102', u'101', u'100', u'99', u'98', u'97', u'96', u'95', u'94', u'93', u'92', u'91', u'90', u'89', u'88', u'87', u'86', u'85', u'84', u'83', u'82', u'81', u'80', u'79', u'78', u'77', u'76', u'75', u'74', u'73', u'72', u'71', u'70', u'69', u'68', u'67', u'66', u'65', u'64', u'63', u'62', u'61', u'60 ', u'59', u'58', u'57', u'56', u'55', u'54', u'53', u'52', u'51', u'50', u'49', u'48', u'47', u'46', u'45', u'44', u'43', u'42', u'41', u'40', u'39', u' 38', u'37', u'36', u'35', u'34', u'33', u'32', u'31', u'30', u'29', u'28', u'27', u'26', u'25', u'24', u'23', u'22', u'21', u'20', u'19', u'18', u'17', u'16', u'15', u'14', u'13', u'12', u'11'] <type 'list'>

代表的な言葉

文字データは、実際には対応する文字列を取得することで文字列データとして扱うことができ JSON モジュールで書式を設定します。

フロントエンドの場合、単語を渡すための代表的なデータとして JSON のデータを使用するため、使用されるメソッドは

"test": JSON.stringify({"test": "test"})

結果例


{
"test":"test"} <type 'unicode'>

関連するソースコード

  • Get メソッド

Get メソッドは wsgi の中にあるメソッドです。

def GET(self):
        # The WSGI spec says 'QUERY_STRING' may be absent.
        raw_query_string = get_bytes_from_wsgi(self.environ, 'QUERY_STRING', '')
        return http.QueryDict(raw_query_string, encoding=self._encoding)

最後のリターンは http.QueryDict(raw_query_string, encoding=self._encoding) httpの生データ、および QueryDict を継承しています。 MultiValueDict
では、直接見てみましょう。 MultiValueDict を実行すればOKです。

  • MultiValueDict

実際にソースコードを見てみると、それほど難しくなさそうですね。

    def get(self, key, default=None):
        """
        Returns the last data value for the passed key.
        or value is an empty list, then default is returned.
        """
        try:
            val = self[key]
        except KeyError:
            return default
        if val == []:
            return default
        return val

    def getlist(self, key, default=None):
        """
        Returns the list of values for the passed key,
        If key doesn't exist, then a default value is returned.
        """
        try:
            return super(MultiValueDict, self). __getitem__(key)
        except KeyError:
            if default is None:
                return []
            return default

    def __getitem__(self, key):
        """
        Returns the last data value for this key, or [] if it's an empty list;
        raises KeyError if not found.
        """
        try:
            list_ = super(MultiValueDict, self). __getitem__(key)
        except KeyError:
            raise MultiValueDictKeyError(repr(key))
        try:
            return list_[-1]
        except IndexError:
            return []
getlist

getlist メソッドもまた、すべてのデータを統合して返すだけのものです。