Upload
satoshi-yamada
View
444
Download
0
Embed Size (px)
Citation preview
1
株式会社アシスト山田 聡 @denzowill
Djangoで業務改善したくなった
2
だいたいこんな感じで生きてます
3
いままで
アプリケーションA
アプリケーションB
アプリケーションC
XMPP Connector
XMPP Connector Mechanize Wrapper
XMPP Connector
5
●XMPP:オープンなチャットプロトコル● Mechanize: ブラウザをコードで操作●BeautifulSoup: Mechanizeの補助●IPMessenger: IPメッセンジャ
アプリケーションA
アプリケーションB
アプリケーションC
XMPP Connector
XMPP Connector Mechanize Wrapper
XMPP Connector
アプリケーションA
アプリケーションB
アプリケーションC
XMPP Connector
XMPP Connector Mechanize Wrapper
XMPP Connector
Ver 0.4
Ver 0.5
Ver 0.6
8
自作ライブラリが時期によってばらばら
9
自作ライブラリが時期によってばらばら
→いちいち更新がめんどくさい
アプリケーションA
アプリケーションA
アプリケーションB
アプリケーションC
XMPP Connector
Mechanize Wrapper
11
中央集権化
アプリケーションA
XMPP Connector
Mechanize Wrapper
Django
13
DjangoだとPythonをWEB化しやすい
14
● HTTPアクセスでJSONを戻すことにした● curlで連打されると情シスに怒られる● 登録・認証しとかないとまずい● Djangoなら簡単っぽい?
15
├─IntraCtl -- イントラ操作を自動化│ ├─lib│ └─migrations├─AuthCtl -- 認証処理│ ├─lib│ ├─migrations│ └─templates│ └─auth├─static -- WEBサービスとしての静的ファイル│ ├─css│ ├─fonts│ └─js├─XmppCtl -- XmppのAPI提供│ ├─lib│ └─migrations└─YmsftUtilServer -- Djangoのプロジェクト
16
# アクセス許可があるAPIアクセスかのチェック用のデコレータdef check_access_permission(func): import functools
@functools.wraps(func) def wrapper(*args, **kwargs): # 第一引数はrequestオブジェクト request = args[0] # host:port/apiname/xxxxx -> apiname api_url = request.path.split("/")[1] from_addr = get_client_ip(request) token_key = request.META.get('HTTP_AUTHORIZATION') if check_token_auth(api_url, from_addr, token_key): return func(*args, **kwargs) else: return fobbiden_response()
return wrapper
Authoraization ヘッダをチェックするデコレータ
17
@comm.check_access_permissiondef post_message(request): ret_dict = { u"error": None, u"message": None } if request.method == 'POST': form = XmppSendForm(request.POST) if form.is_valid():: try: stop_event = threading.Event() exception_event = threading.Event() xmpp_talker_inst = XmppTalker(sender_account, sender_password, ...): xmpp_talker_inst.join() except XWException as e: ret_dict[u"error"] = True ret_dict[u"message"] = e.message else: ret_dict[u"error"] = True ret_dict[u"message"] = u"POST FORMAT ERROR[%s]" % form.errors.as_json() return HttpResponse( json.dumps(ret_dict), content_type='application/json' )
ほかのView層で使う
アプリケーションAXMPP Connector
Mechanize Wrapper
Djangoアプリケーション
Client
HTTP 通信必要なPOSTパラメータとヘッダがあればいい
19
class ClientSDKBase(object): def __init__(self, server_url, token_key): self.server_url = server_url self.token_key = token_key self.encoding = u"utf-8" self.version = u"0.1"
@staticmethod def _http_post(url, headers, base_params_dict): response = {} try: params = urllib.urlencode(base_params_dict) req = urllib2.Request(url, params, headers) res = urllib2.urlopen(req) response["body"] = res.read() response["headers"] = res.info().dict except urllib2.URLError as e: raise YmsftSDKException(e.message) ret_body = response["body"] try: return json.loads(ret_body) except ValueError as e: raise YmsftSDKException("When Parse JSON[%s][%s]" % (e.message, ret_body))
Client側
20
#!/usr/bin/env python# -*- coding: utf-8 -*-
from ymsft_util_client import XmppCtlClientimport sys
# クライアントインスタンス作成ac = XmppCtlClient("http://localhost:8000/", "b7f6e30e44ec109012a3300ead6bd7f429e4cbe6")
# 基本形print ac.post_message( to_addr="[email protected]", post_message=u"こんにちは")
# 送信元アドレス指定print ac.post_message( to_addr="[email protected]", post_message=u"こんにちは", sender_account="[email protected]", sender_password="any_group",)
使い方
21
● Pythonでかき捨てスクリプトがあるならDjango楽● HTTPヘッダも簡単につかえるので認証も楽● FormクラスつかえばValidationも簡単● クライアントはHTTPさえできれば何でもよい
Djangoで簡単に中央集権!