21
1 株式会社アシスト 山田 聡 @denzowill Djangoで業務改善したくなった

Djangoで業務改善したい

Embed Size (px)

Citation preview

Page 1: Djangoで業務改善したい

1

株式会社アシスト山田 聡 @denzowill

Djangoで業務改善したくなった

Page 2: Djangoで業務改善したい

2

だいたいこんな感じで生きてます

Page 3: Djangoで業務改善したい

3

いままで

Page 4: Djangoで業務改善したい

アプリケーションA

アプリケーションB

アプリケーションC

XMPP Connector

XMPP Connector Mechanize Wrapper

XMPP Connector

Page 5: Djangoで業務改善したい

5

●XMPP:オープンなチャットプロトコル● Mechanize: ブラウザをコードで操作●BeautifulSoup: Mechanizeの補助●IPMessenger: IPメッセンジャ

Page 6: Djangoで業務改善したい

アプリケーションA

アプリケーションB

アプリケーションC

XMPP Connector

XMPP Connector Mechanize Wrapper

XMPP Connector

Page 7: Djangoで業務改善したい

アプリケーションA

アプリケーションB

アプリケーションC

XMPP Connector

XMPP Connector Mechanize Wrapper

XMPP Connector

Ver 0.4

Ver 0.5

Ver 0.6

Page 8: Djangoで業務改善したい

8

自作ライブラリが時期によってばらばら

Page 9: Djangoで業務改善したい

9

自作ライブラリが時期によってばらばら

→いちいち更新がめんどくさい

Page 10: Djangoで業務改善したい

アプリケーションA

アプリケーションA

アプリケーションB

アプリケーションC

XMPP Connector

Mechanize Wrapper

Page 11: Djangoで業務改善したい

11

中央集権化

Page 12: Djangoで業務改善したい

アプリケーションA

XMPP Connector

Mechanize Wrapper

Django

Page 13: Djangoで業務改善したい

13

DjangoだとPythonをWEB化しやすい

Page 14: Djangoで業務改善したい

14

● HTTPアクセスでJSONを戻すことにした● curlで連打されると情シスに怒られる● 登録・認証しとかないとまずい● Djangoなら簡単っぽい?

Page 15: Djangoで業務改善したい

15

├─IntraCtl -- イントラ操作を自動化│ ├─lib│ └─migrations├─AuthCtl -- 認証処理│ ├─lib│ ├─migrations│ └─templates│ └─auth├─static -- WEBサービスとしての静的ファイル│ ├─css│ ├─fonts│ └─js├─XmppCtl -- XmppのAPI提供│ ├─lib│ └─migrations└─YmsftUtilServer -- Djangoのプロジェクト

Page 16: 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 ヘッダをチェックするデコレータ

Page 17: Djangoで業務改善したい

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層で使う

Page 18: Djangoで業務改善したい

アプリケーションAXMPP Connector

Mechanize Wrapper

Djangoアプリケーション

Client

HTTP 通信必要なPOSTパラメータとヘッダがあればいい

Page 19: Djangoで業務改善したい

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側

Page 20: Djangoで業務改善したい

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",)

使い方

Page 21: Djangoで業務改善したい

21

● Pythonでかき捨てスクリプトがあるならDjango楽● HTTPヘッダも簡単につかえるので認証も楽● FormクラスつかえばValidationも簡単● クライアントはHTTPさえできれば何でもよい

Djangoで簡単に中央集権!