GitHubアップローダのHTTP応答処理を共通部とGitHub固有部にわけた
ちょっとすっきり。
成果物
GitHub.Upload.Http.Response.201703301533
開発環境
- Linux Mint 17.3 MATE 32bit
- SQLite 3.8.2
- Python 3.4.3
前回まで
http://ytyaru.hatenablog.com/entry/2017/10/19/000000
修正箇所
ファイル | 修正概要 |
---|---|
./web/http/Response.py |
HTTP共通部分。 |
web/service/github/api/v3/Response.py |
GitHub API v3固有部分。 |
Acceptごとに返すデータを変えるところをGitHubで実装した。
GitHub固有部
class Response(web.http.Response.Response): def __init__(self): super().__init__() self.re_content_type_raw = re.compile('application/vnd.github.*.raw') def Get(self, r, sleep_time=2, is_show=True): res = super().Get(r, sleep_time, is_show) if 'json' == self.Headers.ContentType.suffix: return r.json() elif self.re_content_type_raw.match(self.Headers.ContentType.mime_type): return r.content else: return res
たったこれだけ。HTTP部のクラスを継承しているところがポイント。
HTTP共通部
class Response(object): def __init__(self): self.Headers = Response.Headers() def Get(self, r, sleep_time=2, is_show=True): if is_show: print('Response.start---------------------') print("HTTP Status Code: {0} {1}".format(r.status_code, r.reason)) print(r.text) print('Response.end---------------------') time.sleep(sleep_time) r.raise_for_status() self.Headers.ContentType.Split(r) if None is self.Headers.ContentType.mime_type: return None elif 'application/json' == self.Headers.ContentType.mime_type: return r.json() elif ('image/gif' == self.Headers.ContentType.mime_type or 'image/jpeg' == self.Headers.ContentType.mime_type or 'image/png' == self.Headers.ContentType.mime_type ): return Image.open(BytesIO(r.content)) else: return r.text
HTTPのヘッダであるContent-Type
とLink
を解析するクラスを別途つくった。詳しくはソースコード参照。
Content-TypeにあるMimeTypeによって返却値を変える処理をしている。もっと沢山あるが、きりがないので。application/json
はGitHubで頻繁に使う。
所感
クラスの継承を使ってみた。