Django はフロントエンドのデータをいくつかの方法で受け取ります。
フィリピン猿は本当に面白い、国際的に叩かれ放題、何がデタラメ判決だ、中国のものは中国のもの、祖国の領土は神聖不可侵だ。
背景
テストツールキットを書いている途中で、今日はフロントエンドとバックエンドのデータのやり取りの問題にぶつかったので、少し整理してみました。
環境について
バージョン関連
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
メソッドもまた、すべてのデータを統合して返すだけのものです。
関連
-
解決済みお客様のCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
'DataFrame' オブジェクトに 'sort' 属性がありません。
-
Python がエラー xxx.whl はこのプラットフォームでサポートされているホイールではありませんと報告します。
-
Python27 PILソリューションという名前のモジュールがない
-
[Pythonノート】spyderのClearコマンド
-
Pythonでフォルダをトラバースして大きなファイルを探す
-
UnicodeDecodeError: 'ascii' コーデックは位置 0 のバイト 0xe5 をデコードできません: 序数が範囲 (128) にありません。
-
Anaconda 詳細インストールおよび使用チュートリアル(画像付き)
-
Selenium issue IOError: [Errno 2] そのようなファイルまたはディレクトリがありません: 'nul'
-
ValueError: 解凍するために1つ以上の値が必要です。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
チェックされていないruntime.lastError: 接続を確立できませんでした。受信側が存在しません。
-
Pythonコードのデバッグ問題:IOError: イメージファイルを識別できない
-
python3 failed to start Fatal Python error: initfsencoding: unable to load file system codec
-
Python: pyHook-1.5.1-cp37-cp37m-win_amd64.whl はこのプラットフォームでサポートされたホイールではありません。
-
移動平均のPython実装
-
TypeError: 'dict_keys' オブジェクトはインデックス作成をサポートしていません。
-
Pythonのsum関数でTypeError: unsupported operand type(s) for +: 'int' and 'list' エラーを解決する。
-
Pycharmの未解決の参照問題
-
Pythonの非パッケージ問題で相対インポートを試みる
-
Python ネットワークリクエストのエラー "ConnectionRefusedError: [WinError 10061] ターゲットコンピュータがアクティブに拒否したため接続できません"