PythonからElixir Reportのレポートサーバーにアクセスするサンプルコード
Révision | 035502cd03efae53b90c7321f6989d16751f2a72 |
---|---|
Taille | 4,724 octets |
l'heure | 2014-12-03 18:18:41 |
Auteur | hylom |
Message de Log | fix: typo in server_app.py
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
from datetime import date, timedelta
from tornado import ioloop
from tornado import web
from config import config
from report_server import ReportServer
# configurations
CSS_PATH = os.path.join(os.getcwd(), "www_root/css")
JS_PATH = os.path.join(os.getcwd(), "www_root/js")
class MainHandler(web.RequestHandler):
"index.htmlを返すハンドラ"
def get(self):
self.render("index.html")
class TrafficDataHandler(web.RequestHandler):
"トラフィックデータリクエストを処理するハンドラ"
def get(self):
try:
year = int(self.get_argument("y"))
month = int(self.get_argument("m"))
except ValueError:
self.send_err(400)
return
# パラメータで指定された年/月から
# 開始/終了年月日を生成する
start_date = date(year, month, 1)
if month == 12:
end_date = date(year + 1, 1, 1) + timedelta(-1)
else:
end_date = date(year, month + 1, 1) + timedelta(-1)
# レポートサーバーに投げるパラメータを作成
param = {
"start_date": start_date,
"end_date": end_date
}
# リクエスト送信
r = ReportServer(config["report_server"]["user"],
config["report_server"]["password"],
config["report_server"]["host"],
config["report_server"]["port"])
xml = r.data(config["data_source"]["traffic"], param)
# 取得したXMLをクライアントに送信
self.set_header("Content-type", "application/xml")
self.set_status(200)
self.finish(xml)
class PdfHandler(web.RequestHandler):
"PDF出力用ハンドラ"
def get(self):
try:
year = int(self.get_argument("y"))
month = int(self.get_argument("m"))
except ValueError:
self.send_err(400)
return
# パラメータで指定された年/月から
# 開始/終了年月日を生成する
start_date = date(year, month, 1)
if month == 12:
end_date = date(year + 1, 1, 1) + timedelta(-1)
else:
end_date = date(year, month + 1, 1) + timedelta(-1)
# レポートサーバーに投げるパラメータを作成
param = {
"start_date": start_date,
"end_date": end_date
}
# リクエスト送信
r = ReportServer(config["report_server"]["user"],
config["report_server"]["password"],
config["report_server"]["host"],
config["report_server"]["port"])
r.login()
pdf = r.pdf(config["report_template"]["traffic"], param)
# 取得したXMLをクライアントに送信
self.set_header("Content-type", "application/pdf")
self.set_status(200)
self.finish(pdf)
class DataTestHandler(web.RequestHandler):
"テスト用ハンドラ"
def get(self, request_path):
data_dir = os.path.join(os.getcwd(), "testdata")
if request_path == "sample.xml":
target = os.path.join(data_dir, "sample.xml")
f = open(target)
result = f.read()
f.close()
self.set_header("Content-type", "application/xml")
self.set_status(200)
self.finish(result)
elif request_path == "traffic":
try:
year = int(self.get_argument("y"))
month = int(self.get_argument("m"))
except ValueError:
self.send_error(400)
target = os.path.join(data_dir,
"{:04}{:02}.xml".format(year, month))
try:
f = open(target)
except IOError:
self.send_error(404)
result = f.read()
f.close()
self.set_header("Content-type", "application/xml")
self.set_status(200)
self.finish(result)
else:
self.send_error(404)
application = web.Application([
("/", MainHandler),
("/data/traffic", TrafficDataHandler),
("/pdf/traffic", PdfHandler),
("/data/(.*)", DataTestHandler),
("/css/(.*)", web.StaticFileHandler, {"path": CSS_PATH}),
("/js/(.*)", web.StaticFileHandler, {"path": JS_PATH}),
],
template_path=os.path.join(os.getcwd(), 'template')
)
if __name__ == "__main__":
port = 8000
application.listen(port)
print("start listening, port {}".format(port))
ioloop.IOLoop.instance().start()