• R/O
  • HTTP
  • SSH
  • HTTPS

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

PythonからElixir Reportのレポートサーバーにアクセスするサンプルコード


File Info

Rev. 035502cd03efae53b90c7321f6989d16751f2a72
大小 4,724 字节
时间 2014-12-03 18:18:41
作者 hylom
Log Message

fix: typo in server_app.py

Content

#!/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()