Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

リファクタ、コードの整理。

  • Loading branch information...
commit 47bc29029dda634013343654bdf3c36d52e51b1e 1 parent 7febc85
Shigeru KANEMOTO authored
46 application.py
@@ -9,7 +9,8 @@
9 9 app.debug = True
10 10
11 11 from google.appengine.ext import db
12   -import datetime, re
  12 +import datetime
  13 +import re
13 14 import tepco
14 15
15 16 ################################################################################
@@ -116,38 +117,29 @@ def dict_from_usage(usage):
116 117 'capacity_updated': str(usage.capacity_updated),
117 118 }
118 119
119   -def resultHundler(obj):
120   - if not obj:
121   - abort(404)
  120 +RE_CALLBACK = re.compile(r'^[a-zA-Z0-9_.]+$')
122 121
123   - if type(obj).__name__ == 'list' and len(obj) == 0:
  122 +def resultHandler(data):
  123 + if not data:
124 124 abort(404)
125 125
126   - _callback = None
127   - if request.method == "POST" and request.form.get("callback") is not None:
128   - _callback = request.form.get("callback")
129   - elif request.args.get("callback") is not None:
130   - _callback = request.args.get("callback")
131   -
132   - ret = None
133   - if _callback is not None and re.search(r'^[a-zA-Z0-9]+$', _callback):
134   - # XXX security risk
135   - if type(obj).__name__ == 'list':
136   - ret = Response("%s(%s);"%(_callback, json.dumps(obj, indent=2)), mimetype='application/json')
137   - else:
138   - ret = Response("%s(%s);"%(_callback, json.dumps(dict_from_usage(obj), indent=2)), mimetype='application/json')
139   - elif type(obj).__name__ == 'list' :
140   - # XXX security risk
141   - ret = Response(json.dumps(obj, indent=2), mimetype='application/json')
  126 + if request.method == 'POST':
  127 + callback = request.form.get('callback')
142 128 else:
143   - ret = jsonify(dict_from_usage(obj))
  129 + callback = request.args.get('callback')
  130 + if callback and not RE_CALLBACK.search(callback):
  131 + abort(404)
144 132
145   - return ret;
  133 + data = json.dumps(data, indent=2)
  134 + if callback:
  135 + return Response('%s(%s);' % (callback, data), mimetype='text/javascript')
  136 + else:
  137 + return Response(data, mimetype='application/json')
146 138
147 139 @app.route('/latest.json')
148 140 def latest():
149 141 usage = Usage.all().order('-entryfor').get()
150   - return resultHundler(usage)
  142 + return resultHandler(dict_from_usage(usage))
151 143
152 144 @app.route('/<int:year>/<int:month>/<int:day>/<int:hour>.json')
153 145 def hour(year, month, day, hour):
@@ -157,7 +149,7 @@ def hour(year, month, day, hour):
157 149 usage = usage.filter('day =', day)
158 150 usage = usage.filter('hour =', hour)
159 151 usage = usage.get()
160   - return resultHundler(usage)
  152 + return resultHandler(dict_from_usage(usage))
161 153
162 154 @app.route('/<int:year>/<int:month>/<int:day>.json')
163 155 def day(year, month, day):
@@ -167,7 +159,7 @@ def day(year, month, day):
167 159 usage = usage.filter('day =', day)
168 160 usage = usage.order('entryfor')
169 161 usage = [dict_from_usage(u) for u in usage]
170   - return resultHundler(usage)
  162 + return resultHandler(usage)
171 163
172 164 @app.route('/<int:year>/<int:month>.json')
173 165 def month(year, month):
@@ -176,5 +168,5 @@ def month(year, month):
176 168 usage = usage.filter('month =', month)
177 169 usage = usage.order('entryfor')
178 170 usage = [dict_from_usage(u) for u in usage]
179   - return resultHundler(usage)
  171 + return resultHandler(usage)
180 172
0  crossdomain.xml 100755 → 100644
File mode changed
7 templates/top.html
@@ -88,8 +88,8 @@
88 88 <h2>APIの使い方</h2>
89 89 <p>
90 90 <ul>
91   - <li>URLに日時を与えて、単純にGETしてください。</li>
92   - <li>URLの最後に「?callback=<i>コールバック関数名</i>」を付けると、JSONPになります。</li>
  91 + <li>URLに日時を与えて、GETまたはPOSTしてください。</li>
  92 + <li>URLの最後に「?callback=<i>コールバック関数名</i>」を付けると、JSONPになります。関数名に使える文字は、英数字と「_」と「.」です。それ以外の文字が入っていると404のエラーになります。</li>
93 93 <li>データが存在しない場合には404のエラーになります。</li>
94 94 <li>Adobe Flashのために、「/crossdomain.xml」が有ります。</li>
95 95 </ul>
@@ -137,6 +137,9 @@
137 137 <p>
138 138 <ul>
139 139 <li>
  140 + 2011-3-24 <a href="https://github.com/withgod">withgodさん</a>からの<a href="https://github.com/sgk/tepco-usage-api/pull/1">プルリクエスト</a>をマージしました。JSONPのcallback関数名をチェックします。POSTも使えるようにしました。
  141 + </li>
  142 + <li>
140 143 2011-3-24 JSONPに対応しました。
141 144 Adobe Flashのための「/crossdomain.xml」を置きました。
142 145 </li>

0 comments on commit 47bc290

Please sign in to comment.
Something went wrong with that request. Please try again.