Apilecture for 2014/02/22 at shannonlab

572 views

Published on

lecture resume for 2/22

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
572
On SlideShare
0
From Embeds
0
Number of Embeds
37
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Apilecture for 2014/02/22 at shannonlab

  1. 1. Django×APIで遊ぶ 小林泰
  2. 2. タイムライン 0. 自己紹介 1.APIとは? 2.APIの(具体的)使い方例 3.データ形式 4. Pythonのターミナル上で動かしてみる 5. Djangoにのせてみる
  3. 3. 1.APIとは?
  4. 4. APIの定義 Application programming Interface 直訳:アプリケーションをプログラムする時の接続
  5. 5. APIがなければ Hello world!と表示されるためのプログラムでも ①Hello worldという文字のドットデータを作る ②そのデータをバッファに格納するプログラムを作る ③格納されたデータが正しく出力されるようにグラフィックカー ドに対するプログラムも作る めんどくさい。
  6. 6. WEB API 今回扱うのはWEB APIと呼ばれるもの 「Httpリクエストを送ったら、データを返してくれるようなもの」
  7. 7. ためしに。。。。 今日使うAPIをブラウザーで叩いてみよう 参照ホームページ http://zip.cgis.biz
  8. 8. How to Use
  9. 9. How to use http://zip.cgis.biz/xml/zip.php?zn=郵便番号 というページをリクエストすると住所のデータが xml形式で返ってくる Cf:http://zip.cgis.biz/csv/zip.php?zn=郵便番号
  10. 10. TRY1 ①ブラウザーを開く
  11. 11. TRY2 http://zip.cgis.biz/xml/zip.php?zn=郵便番号で検索
  12. 12. TRY3 結果が返される
  13. 13. 結果xml形式 <ZIP_result> <result name="ZipSearchXML"/> <result version="1.01"/> <result request_url="http%3A%2F%2Fzip.cgis.biz%2Fxml%2Fzip.php%3Fzn%3D1690075"/> <result request_zip_num="1690075"/> <result request_zip_version="none"/> <result result_code="1"/> <result result_zip_num="1690075"/> <result result_zip_version="0"/> <result result_values_count="1"/> <ADDRESS_value> <value state_kana="トウキョウト"/> <value city_kana="シンジュクク"/> <value address_kana="タカダノババ"/> <value company_kana="none"/> <value state="東京都"/> <value city="新宿区"/> <value address="高田馬場"/> <value company="none"/> </ADDRESS_value> </ZIP_result>
  14. 14. csvの方もやってみよう http://zip.cgis.biz/csv/zip.php?zn=郵便番号
  15. 15. 結果csv形式 "ZipSearchXML","1.01","http://zip.cgis.biz/csv/zi p.php?zn=1690075","1690075","none","1","169 0075","0","1" "トウキョウト","シンジュクク","タカダノババ","none","東京 都","新宿区","高田馬場","none"
  16. 16. WEB API 今回扱うのはWEB APIと呼ばれるもの 「Httpリクエストを送ったら、データを返してくれるようなもの」 例)http://zip.cgis.biz/csv/zip.php?zn=1690075にアクセス ☞住所がcsv形式で得られる!!
  17. 17. 2.Examples of APIs
  18. 18. Facebook api WEB API例
  19. 19. WEB API例 Twitter api
  20. 20. twitterAPIを使っている例
  21. 21. 3.得られるデータ
  22. 22. 得られるデータ xml csv json Exelシート 等が得られる
  23. 23. xml Extensible Markup Language タグを用いて論理構造などを表現 <要素名 属性="値">内容</要素名>
  24. 24. Xml例:さっきのやつ <ZIP_result> <result name="ZipSearchXML"/> <result version="1.01"/> <result request_url="http%3A%2F%2Fzip.cgis.biz%2Fxml%2Fzip.php%3Fzn%3D1690075"/> <result request_zip_num="1690075"/> <result request_zip_version="none"/> <result result_code="1"/> <result result_zip_num="1690075"/> <result result_zip_version="0"/> <result result_values_count="1"/> <ADDRESS_value> <value state_kana="トウキョウト"/> <value city_kana="シンジュクク"/> <value address_kana="タカダノババ"/> <value company_kana="none"/> <value state="東京都"/> <value city="新宿区"/> <value address="高田馬場"/> <value company="none"/> </ADDRESS_value> </ZIP_result>
  25. 25. csv Comma-separated values 字義通り、カンマで値を区切る形式 例:さっきのやつ "トウキョウト","シンジュクク","タカダノババ","none","東京 都","新宿区","高田馬場"
  26. 26. json JavaScript Object Notation Javascriptのオブジェクト記述をベースにしている {"name": "John Smith", "age": 33} ☞pythonの辞書形式にかなり近い
  27. 27. Json を返してくれるAPIの例 http://www.ekidata.jp/api/api_line.php
  28. 28. 加工 データそのままでは使えないので、それを切り 出す操作が必要になる。 →それを行うためのモジュールがある
  29. 29. Xmlの場合 ・Element Tree (python標準装備) ・xml.dom.minidom ・lxml ・Beautifulsoup ・xml.parsers.expat ネットにいっぱい落ちています。
  30. 30. Element Tree Xmlデータそのままでは使えないので、python で使えるように変更する必要がある。 Element型という形 例: import xml.etree.ElementTree as ET data = ET.fromstring (response.read())
  31. 31. Practice:element tree <window width="1920"> <title font="large" color="red">sample</title> <buttonbox> <button>OK</button> <button>Cancel</button> </buttonbox> </window>
  32. 32. Step1:文字列から String = <window width="1920”><title font="large" color="red">sample</title><buttonbox><button >OK</button> <button>Cancel</button></buttonbox></windo w> elem = fromstring(String)
  33. 33. Step1:ファイルから data = parse(“sample.xml”) elem = data.getroot()
  34. 34. elem ←この中にデータを格納し た!! 取り出してみよう
  35. 35. tag名 <window width="1920"> <title font="large" color="red">sample</title> <buttonbox> <button>OK</button> <button>Cancel</button> </buttonbox> </window>
  36. 36. attribute <window width="1920"> <title font="large" color="red">sample</title> <buttonbox> <button>OK</button> <button>Cancel</button> </buttonbox> </window>
  37. 37. Attributeのvalue <window width="1920"> <title font="large" color="red">sample</title> <buttonbox> <button>OK</button> <button>Cancel</button> </buttonbox> </window>
  38. 38. value <window width="1920"> <title font="large" color="red">sample</title> <buttonbox> <button>OK</button> <button>Cancel</button> </buttonbox> </window>
  39. 39. Tagの名前の取り出し print elem.tag Result:window
  40. 40. Attributeを指定してvalue取得 print elem.get(“width”) Result:1920
  41. 41. Attribute名のリスト取得 print elem.keys() Result:[‘width’]
  42. 42. どっちも欲しい!! print elem.items() Result:[(‘width’,’1920’)]
  43. 43. 条件にマッチする要素を返す for e in elem.findall(“.//button”): print e.tag Result: button button
  44. 44. 全部ほしい for e in elem.getiterator(): print e.tag Result: window title buttonbox button button
  45. 45. 特定のものだけ欲しい for in elem.getiterator(“button”): print e.tag Result: button button
  46. 46. csv csv (という標準装備のモジュールがある) 例:readerさえ使えればなんとかなる list =[] f = csv.reader(FILE) for row in f: list.append(row) print list
  47. 47. json json (標準装備) Simplejson 例 >>> import json >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') [u'foo', {u'bar': [u'baz', None, 1.0, 2]}] >>> json.loads('""foobar"') u'"foox08ar’
  48. 48. Practice(変換だけですが) {'Python':'python.org’, 'SearchEngine':('gogle.co. jp','yahoo.co.jp')} これをデコードして辞書型に変換しましょう。 デコードしたものからkeyごとに取り出せるかも 見てみましょう
  49. 49. そのまえにencodeしてみる import json data = さっきの encoded = json.dumps(data) Print type(encoded)
  50. 50. Decodeしてみよう decoded = json.loads(encoded) print decoded print type(decoded)
  51. 51. 取り出し print decoded[‘Python’] print decoded[‘SearchEngine’]
  52. 52. 3.ターミナルで動かす
  53. 53. 郵便番号プログラム さっきの郵便番号から住所を得るAPIを使うプロ グラムを書いて、結果を表示してみましょう。
  54. 54. 例題1:データを得てそのまま表示 手順: ①アクセスするurl文字列を作成 ②urllib2モジュールで、作ったurl文字列を使 用して、httpレスポンスを得る ③得たレスポンスをprintで表示
  55. 55. ①アクセスするurlを作る ヒント: ・inputを使う ・固定部分 url = “http://zip.cgis.biz/xml/zip.php?zn=“ 追加する部分(郵便番号)=input url = url + 郵便番号 ※型はstring
  56. 56. ②urllib2でレスポンスを得る ヒント: レスポンスオブジェクトは response = urllib2.urlopen(url) で得られます
  57. 57. ③レスポンスを表示 ヒント: オブジェクト print responseでok
  58. 58. 例題1:解答例 #!/usr/bin/env python # -*- coding: utf-8 -*import urllib2 import xml.etree.ElementTree as ET if __name__=='__main__': num = input('address number?') url = 'http://zip.cgis.biz/xml/zip.php?zn=' address = str(num) response = urllib2.urlopen(url+address) data = response.read() print data
  59. 59. 例題2:加工して表示 得たデータを 都道府県 値 市町村 値 住所 値 という形に表示しよう。
  60. 60. 手順 ①responseオブジェクトを加工可能な形に変換 →element.treeを使う ②変換したものをpython辞書型に落とし込む ③それを表示
  61. 61. ①responseオブジェクトを加工 ヒント まずはパースすること→elementtree型にする 参考: http://docs.python.jp/2/library/xml.etree.eleme nttree.html あとは先ほどのスライド
  62. 62. ②python辞書型に変換 ヒント 今回の郵便番号APIはvalueでなくてattribute として結果を返している <value state="東京都"/> 赤字が欲しい!! elem.items ???
  63. 63. ③表示 ヒント 辞書をプリントするので、キーを指定してプリントすればok
  64. 64. 解答例前半 #!/usr/bin/env python # -*- coding: utf-8 -*import sys import urllib2 from xml.etree.ElementTree import * import xml.etree.ElementTree as ET def api(a): url = 'http://zip.cgis.biz/xml/zip.php?zn=' address = str(a) response = urllib2.urlopen(url+address) return response
  65. 65. 解答例後半 if __name__=='__main__': num = input('address number?') response = api(num) data = response.read() root = ET.fromstring(data) data = {} for value in root.iter('value'): for k,v in value.attrib.items(): #print k , v nome = k basho = v data.update({nome:basho})
  66. 66. <ZIP_result> <result name="ZipSearchXML"/> <result version="1.01"/> <result request_url="http%3A%2F%2Fzip.cgis.biz%2Fxml%2Fzip.php%3Fzn%3D1690075"/> <result request_zip_num="1690075"/> <result request_zip_version="none"/> <result result_code="1"/> <result result_zip_num="1690075"/> <result result_zip_version="0"/> <result result_values_count="1"/> <ADDRESS_value> <value state_kana="トウキョウト"/> <value city_kana="シンジュクク"/> <value address_kana="タカダノババ"/> <value company_kana="none"/> <value state="東京都"/> <value city="新宿区"/> <value address="高田馬場"/> <value company="none"/> </ADDRESS_value> </ZIP_result>
  67. 67. 解答例最後 state = data['state'] city = data['city'] address = data['address'] print state print city print address
  68. 68. 4.Djangoで動かす
  69. 69. Django復習 https://www.djangoproject.com
  70. 70. Djangoとは 『python用のwebフレームワーク』 ※フレームワーク webアプリケーションの鋳型 根本的な部分はフレームワークに任せられる
  71. 71. おおまかな構造 view URL MODEL
  72. 72. おおまかな構造 HTTPリクエスト view URL MODEL
  73. 73. おおまかな構造 HTTPリクエスト 命令振り分け view URL MODEL
  74. 74. おおまかな構造 HTTPリクエスト 処理!! view URL データやり取り MODEL
  75. 75. おおまかな構造 処理!! view HTTPレスポンスオブジェクト Result Django
  76. 76. view ページの表示にかかわる部分。 アプリケーションの処理部分を書く
  77. 77. MODEL アプリケーションに欠かせないデータ の保管に関係する部分
  78. 78. URL 作成するアプリケーションの別々のページの間 の関係、URLまわりの設定をする
  79. 79. Djangoプロジェクトを立ち上げる ダウンロードしていない人はする
  80. 80. startproject 適当なディレクトリで django-admin.py startproject mysiteを実行
  81. 81. ディレクトリができているはず
  82. 82. 自動的にディレクトリの中身も
  83. 83. startappする python manage.py startapp finda
  84. 84. 自動的にfindaが作成される
  85. 85. データベースを使えるようにする python manage.py syncdb →上手く動かない。settings.pyを変更
  86. 86. settings.py
  87. 87. settings.py MODEL設定
  88. 88. settings.py MODEL設定
  89. 89. 改めてsyncdb
  90. 90. fooができている
  91. 91. フローを考える 《住所表示アプリケーション》 ①トップページにアクセス ②トップページの郵便番号欄に打ち込む ③送信 ④結果表示
  92. 92. ①トップページにアクセス 機能 ・topページurlにリクエストを送ると、郵便番号 記入するフォームが現れる ・viewに書き込む indexクラス
  93. 93. ②③送信 機能 ・送信すると、view内の他の関数が働いて、入 力された数字を加工して、apiに送信、データ を受け取る これもviewに書く
  94. 94. ④結果表示 機能 ・②③のデータ処理と同じところに入れる or ・②③の結果をモデルに入れて、そこから引き 出して使う サンプルプログラムは前者です
  95. 95. ①いきなりはわからない
  96. 96.
  97. 97. ①finda/urls.py
  98. 98.
  99. 99. ①mysite/urls.py
  100. 100. ①mysite/urls.py
  101. 101. runserver
  102. 102. 結果
  103. 103. templateの利用
  104. 104. finda/templates/finda/index.html
  105. 105. viewの書き換え
  106. 106. templateの読み込み
  107. 107. 結果
  108. 108. templateに値を入れて表示したい時 html {{listall}} view list = list context = {‘listall’:list} return render(request,'finda/index.html',context)
  109. 109. Django で動かす ここまででviewの作り方がわかりました ・値はhtmlのformで得るといいでしょう。 ・得たものをurl文字列に整形します 初めの方に作ったプログラムを流用します ・先ほどのプログラムで辞書型データを作成 ・templateに値を与えて表示
  110. 110. 手順例 ①プロジェクトを作る 済 ②appを作る 済 ③syncdb 済 ④settings.pyの設定 済 ⑤urls.pyの設定 resultクラスのurl設定 ⑥ビューの作成 resultクラスを作る ⑦テンプレートの作成
  111. 111. やってみましょう 参考url: チュートリアル https://docs.djangoproject.com/en/1.6/intro/tutori al01/ posts送信されたデータの受け取り http://www.djangoproject.jp/doc/ja/1.0/ref/reques t-response.html http://stackoverflow.com/questions/12518517/req uest-post-getsth-vs-request-poststh-difference
  112. 112. やってみましょう
  113. 113. 解答 下のコマンドでgitしてください git clone https://bitbucket.org/tsukukobaan/api.git/

×