apilecture for 2014/02/22 at shannonlab
Post on 28-May-2015
327 Views
Preview:
DESCRIPTION
TRANSCRIPT
Django×API で遊ぶ
小林泰
タイムライン0. 自己紹介1 . API とは?2 . API の(具体的)使い方例3 .データ形式4. Python のターミナル上で動かしてみる5. Django にのせてみる
1 . API とは?
API の定義
Application programming Interface
直訳:アプリケーションをプログラムする時の接続
API がなければHello world! と表示されるためのプログラムでも
①Hello world という文字のドットデータを作る② そのデータをバッファに格納するプログラムを作る③ 格納されたデータが正しく出力されるようにグラフィックカー ドに対するプログラムも作る
めんどくさい。
WEB API
今回扱うのは WEB API と呼ばれるもの
「 Http リクエストを送ったら、データを返してくれるようなもの」
ためしに。。。。今日使う API をブラウザーで叩いてみよう参照ホームページ http://zip.cgis.biz
How to Use
How to use
http://zip.cgis.biz/xml/zip.php?zn=郵便番号というページをリクエストすると住所のデータが xml 形式で返ってくる
Cf : http://zip.cgis.biz/csv/zip.php?zn=郵便番号
TRY 1① ブラウザーを開く
TRY 2http://zip.cgis.biz/xml/zip.php?zn=郵便番号で検索
TRY3
結果が返される
結果 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>
csv の方もやってみようhttp://zip.cgis.biz/csv/zip.php?zn= 郵便番号
結果 csv 形式"ZipSearchXML","1.01","http://zip.cgis.biz/csv/zip.php?zn=1690075","1690075","none","1","1690075","0","1"" トウキョウト "," シンジュクク "," タカダノババ ","none"," 東京都 "," 新宿区 "," 高田馬場 ","none"
WEB API
今回扱うのは WEB API と呼ばれるもの
「 Http リクエストを送ったら、データを返してくれるようなもの」
例) http://zip.cgis.biz/csv/zip.php?zn=1690075にアクセス
☞住所が csv 形式で得られる!!
2 . Examples of APIs
WEB API 例Facebook api
WEB API 例Twitter api
twitterAPI を使っている例
3 .得られるデータ
得られるデータxmlcsvjsonExel シート
等が得られる
xml
Extensible Markup Languageタグを用いて論理構造などを表現
< 要素名 属性 =" 値 "> 内容 </ 要素名 >
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>
csv
Comma-separated values字義通り、カンマで値を区切る形式
例:さっきのやつ" トウキョウト "," シンジュクク "," タカダノババ ","none"," 東京都 "," 新宿区 "," 高田馬場 "
json
JavaScript Object NotationJavascript のオブジェクト記述をベースにしている
{"name": "John Smith", "age": 33}
☞python の辞書形式にかなり近い
Json を返してくれる API の例http://www.ekidata.jp/api/api_line.php
加工
データそのままでは使えないので、それを切り出す操作が必要になる。 →それを行うためのモジュールがある
Xml の場合・ Element Tree ( python 標準装備)・ xml.dom.minidom・ lxml・ Beautifulsoup・ xml.parsers.expatネットにいっぱい落ちています。
Element Tree
Xml データそのままでは使えないので、 pythonで使えるように変更する必要がある。Element 型という形
例:import xml.etree.ElementTree as ETdata = ET.fromstring (response.read())
Practice:element tree
<window width="1920"><title font="large"
color="red">sample</title><buttonbox>
<button>OK</button><button>Cancel</button>
</buttonbox></window>
Step1: 文字列からString = <window width="1920”><title font="large" color="red">sample</title><buttonbox><button>OK</button><button>Cancel</button></buttonbox></window>
elem = fromstring(String)
Step1: ファイルからdata = parse(“sample.xml”)elem = data.getroot()
elem ← この中にデータを格納した!! 取り出してみよう
tag 名<window width="1920">
<title font="large" color="red">sample</title>
<buttonbox><button>OK</button><button>Cancel</button>
</buttonbox></window>
attribute
<window width="1920"><title font="large"
color="red">sample</title><buttonbox>
<button>OK</button><button>Cancel</button>
</buttonbox></window>
Attribute の value
<window width="1920"><title font="large"
color="red">sample</title><buttonbox>
<button>OK</button><button>Cancel</button>
</buttonbox></window>
value
<window width="1920"><title font="large"
color="red">sample</title><buttonbox>
<button>OK</button><button>Cancel</button>
</buttonbox></window>
Tag の名前の取り出しprint elem.tag
Result:window
Attribute を指定して value 取得print elem.get(“width”)
Result:1920
Attribute 名のリスト取得print elem.keys()
Result:[‘width’]
どっちも欲しい!!print elem.items()
Result:[(‘width’,’1920’)]
条件にマッチする要素を返すfor e in elem.findall(“.//button”): print e.tag
Result:buttonbutton
全部ほしいfor e in elem.getiterator(): print e.tag
Result:windowtitlebuttonboxbuttonbutton
特定のものだけ欲しいfor in elem.getiterator(“button”):
print e.tag
Result:buttonbutton
csv
csv (という標準装備のモジュールがある)
例 :reader さえ使えればなんとかなるlist =[]f = csv.reader(FILE)for row in f:
list.append(row)print list
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('"\\"foo\\bar"')u'"foo\x08ar’
Practice( 変換だけですが )
{'Python':'python.org’, 'SearchEngine':('gogle.co.jp','yahoo.co.jp')}
これをデコードして辞書型に変換しましょう。デコードしたものから key ごとに取り出せるかも見てみましょう
そのまえに encode してみるimport json
data = さっきのencoded = json.dumps(data)Print type(encoded)
Decode してみようdecoded = json.loads(encoded)
print decodedprint type(decoded)
取り出し
print decoded[‘Python’]print decoded[‘SearchEngine’]
3 .ターミナルで動かす
郵便番号プログラム
さっきの郵便番号から住所を得る API を使うプログラムを書いて、結果を表示してみましょう。
例題1:データを得てそのまま表示
手順:
①アクセスする url 文字列を作成 ② urllib2 モジュールで、作った url 文字列を使 用して、 http レスポンスを得る ③得たレスポンスを print で表示
① アクセスする url を作るヒント:
・ input を使う・固定部分 url = “http://zip.cgis.biz/xml/zip.php?zn=“ 追加する部分(郵便番号)= input url = url + 郵便番号
※ 型は string
②urllib2 でレスポンスを得るヒント:
レスポンスオブジェクトは
response = urllib2.urlopen(url)
で得られます
③ レスポンスを表示ヒント:
オブジェクトprint response で ok
例題1:解答例#!/usr/bin/env python# -*- coding: utf-8 -*-
import urllib2import 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
例題2:加工して表示得たデータを
都道府県 値市町村 値住所 値
という形に表示しよう。
手順①response オブジェクトを加工可能な形に変換 → element.tree を使う② 変換したものを python 辞書型に落とし込む③ それを表示
①response オブジェクトを加工ヒント
まずはパースすること→ elementtree 型にする
参考: http://docs.python.jp/2/library/xml.etree.elementtree.htmlあとは先ほどのスライド
②python 辞書型に変換ヒント今回の郵便番号 API は value でなくてattributeとして結果を返している
<value state=" 東京都 "/>
赤字が欲しい!! elem.items ???
③ 表示ヒント
辞書をプリントするので、キーを指定してプリントすれば ok
解答例前半#!/usr/bin/env python# -*- coding: utf-8 -*-
import sysimport urllib2from 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
解答例後半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 , vnome = kbasho = vdata.update({nome:basho})
<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>
解答例最後 state = data['state']
city = data['city']address = data['address']print stateprint cityprint address
4 . Django で動かす
Django復習https://www.djangoproject.com
Django とは『 python 用の web フレームワーク』
※ フレームワーク web アプリケーションの鋳型 根本的な部分はフレームワークに任せられる
おおまかな構造
view
MODEL
URL
おおまかな構造
view
MODEL
URL
HTTP リクエスト
おおまかな構造
view
MODEL
URL
HTTP リクエスト
命令振り分け
おおまかな構造
MODEL
URL
HTTP リクエスト
view処理!!
データやり取り
おおまかな構造
view処理!!
Django
HTTP レスポンスオブジェクト
Result
view
ページの表示にかかわる部分。アプリケーションの処理部分を書く
MODEL
アプリケーションに欠かせないデータの保管に関係する部分
URL
作成するアプリケーションの別々のページの間の関係、 URL まわりの設定をする
Django プロジェクトを立ち上げる
ダウンロードしていない人はする
startproject
適当なディレクトリでdjango-admin.py startproject mysite を実行
ディレクトリができているはず
自動的にディレクトリの中身も
startapp するpython manage.py startapp finda
自動的に finda が作成される
データベースを使えるようにする
python manage.py syncdb
→ 上手く動かない。 settings.py を変更
settings.py
settings.py MODEL設定
settings.py MODEL設定
改めて syncdb
foo ができている
フローを考える《住所表示アプリケーション》① トップページにアクセス② トップページの郵便番号欄に打ち込む③ 送信④結果表示
① トップページにアクセス機能・ top ページ url にリクエストを送ると、郵便番号 記入するフォームが現れる
・ view に書き込む index クラス
②③ 送信機能・送信すると、 view 内の他の関数が働いて、入 力された数字を加工して、 api に送信、データ を受け取る
これも view に書く
④結果表示機能・②③のデータ処理と同じところに入れるor・②③の結果をモデルに入れて、そこから引き 出して使う
サンプルプログラムは前者です
① いきなりはわからない
①
①finda/urls.py
①
①mysite/urls.py
①mysite/urls.py
runserver
結果
template の利用
finda/templates/finda/index.html
view の書き換え
template の読み込み
結果
template に値を入れて表示したい時
html{{listall}}
viewlist = listcontext = {‘listall’:list}return render(request,'finda/index.html',context)
Django で動かすここまでで view の作り方がわかりました
・値は html の form で得るといいでしょう。・得たものを url 文字列に整形します 初めの方に作ったプログラムを流用します・先ほどのプログラムで辞書型データを作成・ template に値を与えて表示
手順例① プロジェクトを作る 済②app を作る 済③syncdb 済④settings.py の設定 済⑤urls.py の設定 result クラスの url設定⑥ビューの作成 result クラスを作る⑦テンプレートの作成
やってみましょう参考 url:チュートリアルhttps://docs.djangoproject.com/en/1.6/intro/tutorial01/posts 送信されたデータの受け取りhttp://www.djangoproject.jp/doc/ja/1.0/ref/request-response.htmlhttp://stackoverflow.com/questions/12518517/request-post-getsth-vs-request-poststh-difference
やってみましょう
解答
下のコマンドでgitしてください
git clone https://bitbucket.org/tsukukobaan/api.git/
top related