SlideShare une entreprise Scribd logo
1  sur  21
Télécharger pour lire hors ligne
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_permission
def 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層で使う
アプリケーションA
XMPP 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 XmppCtlClient
import sys
# クライアントインスタンス作成
ac = XmppCtlClient("http://localhost:8000/", "b7f6e30e44ec109012a3300ead6bd7f429e4cbe6")
# 基本形
print ac.post_message(
to_addr="sayamada@xxxxx.co.jp",
post_message=u"こんにちは"
)
# 送信元アドレス指定
print ac.post_message(
to_addr="sayamada@xxxxx.co.jp",
post_message=u"こんにちは",
sender_account="any_group@xxxxx.co.jp",
sender_password="any_group",
)
使い方
21
●
Pythonでかき捨てスクリプトがあるならDjango楽
●
HTTPヘッダも簡単につかえるので認証も楽
●
FormクラスつかえばValidationも簡単
●
クライアントはHTTPさえできれば何でもよい
Djangoで簡単に中央集権!

Contenu connexe

En vedette

En vedette (13)

[OSC2016沖縄]商用DBからPostgreSQLへの移行入門
[OSC2016沖縄]商用DBからPostgreSQLへの移行入門[OSC2016沖縄]商用DBからPostgreSQLへの移行入門
[OSC2016沖縄]商用DBからPostgreSQLへの移行入門
 
PostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLPostgreSQLとPythonとSQL
PostgreSQLとPythonとSQL
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
 
bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩
 
PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
PostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめPostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめ
 
In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性In-Database Analyticsの必要性と可能性
In-Database Analyticsの必要性と可能性
 

Similaire à Djangoで業務改善したい

Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
maebashi
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
Kentarou Mukunasi
 

Similaire à Djangoで業務改善したい (20)

ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 
Web技術勉強会 第31回
Web技術勉強会 第31回Web技術勉強会 第31回
Web技術勉強会 第31回
 
密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
ICSをビルドしてみた
ICSをビルドしてみたICSをビルドしてみた
ICSをビルドしてみた
 
研究を加速するChainerファミリー
研究を加速するChainerファミリー研究を加速するChainerファミリー
研究を加速するChainerファミリー
 
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
 
プログラマー
プログラマープログラマー
プログラマー
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
 
邪道Jenkins
邪道Jenkins邪道Jenkins
邪道Jenkins
 
云推送技术实现与敏捷开发
云推送技术实现与敏捷开发云推送技术实现与敏捷开发
云推送技术实现与敏捷开发
 
Automatic Mixed Precision の紹介
Automatic Mixed Precision の紹介Automatic Mixed Precision の紹介
Automatic Mixed Precision の紹介
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験
 
ニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixir
 
初めてのプラグイン開発
初めてのプラグイン開発初めてのプラグイン開発
初めてのプラグイン開発
 
Rdkitの紹介
Rdkitの紹介Rdkitの紹介
Rdkitの紹介
 
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
OpenStack Neutronの機能概要 - OpenStack最新情報セミナー 2014年12月
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
 
OSC福岡 20111203
OSC福岡 20111203OSC福岡 20111203
OSC福岡 20111203
 

Plus de Satoshi Yamada

Plus de Satoshi Yamada (9)

Pythonで業務改善をしたときにあった問題(ライト版)
Pythonで業務改善をしたときにあった問題(ライト版)Pythonで業務改善をしたときにあった問題(ライト版)
Pythonで業務改善をしたときにあった問題(ライト版)
 
pythonでemlファイルを扱う話
pythonでemlファイルを扱う話pythonでemlファイルを扱う話
pythonでemlファイルを扱う話
 
Requestsで始める5分前帰社
Requestsで始める5分前帰社Requestsで始める5分前帰社
Requestsで始める5分前帰社
 
DBエンジニアに必要だったPythonのスキル
DBエンジニアに必要だったPythonのスキルDBエンジニアに必要だったPythonのスキル
DBエンジニアに必要だったPythonのスキル
 
本気でPythonで宛名書きした話
本気でPythonで宛名書きした話本気でPythonで宛名書きした話
本気でPythonで宛名書きした話
 
10080分でPythonからIP Messeneger
10080分でPythonからIP Messeneger10080分でPythonからIP Messeneger
10080分でPythonからIP Messeneger
 
15分で情シスに怒られる方法
15分で情シスに怒られる方法15分で情シスに怒られる方法
15分で情シスに怒られる方法
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
 
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
201505 PostgreSQLアンカンファレンス(PL/Pythonで作るWEBアプリ)
 

Djangoで業務改善したい