def post(self): # ログインしているユーザーのみ作成可能 if not users.get_current_user(): logging.error('not signed in user') self.redirect('/') return # カウンター名は表示に使うのでエスケープする # 長さも勝手に100文字程度に制限。あとでformに明記する name = cgi.escape(self.request.get('name')[:100]) if name == '': name = 'No name' # transactionを使うべきなのか? counter = Counter(name = name) counter_key = counter.put() # デフォルトの画像を用意する for i in range(10): path = os.path.join(os.path.dirname(__file__), os.pardir, 'images', str(i) + '.png') number = NumberImage( parent = counter_key, number = i, data = open(path).read(), ) key = number.put() # 削除するときに参照できるようListで保持させる counter.image.append(key) counter.put() self.redirect('/')
def post(self): """ requestからkeyを受け取り、対応するCounterのentityを削除する """ try: # 削除する対象を取得 counter = Counter.get(db.Key(encoded = self.request.get('key'))) # 現在のユーザーと関連づけられていなければ403エラー if counter == None or counter.user != users.get_current_user(): responses.display_error(self, 403) return # 関連画像、アクセス履歴ともに一括削除 for image in counter.image: NumberImage.get(image).delete() for record in AccessRecord.all().ancestor(counter): record.delete() counter.delete() self.redirect('/') # requestのkeyが正しくない場合 except BadKeyError, error: logging.error(str(error)) responses.display_error(self, 400)
def get(self): try: # パスの解析 name = self.request.path.split('/')[2] (key, type) = name.split('.') key = db.Key(key) output_encoding = [images.PNG, images.JPEG][['png', 'jpg'].index(type)] # カウンターの取得 counter = Counter.get(key) if not counter: responses.display_error(self, 404) return # アクセス履歴情報の取得 record = { 'referer' : self.request.headers.get('Referer'), 'user_agent' : self.request.headers.get('User-Agent'), 'remote_addr' : self.request.remote_addr, } # カウントのインクリメント result = db.run_in_transaction(self.increment_count, counter.key(), record) count = Counter.get(result).count logging.debug(count) # 新しいカウントを桁毎に区切る digits = [] while count / 10 != 0: digits.append(count % 10) count /= 10 digits.append(count) # 使用する画像データの読み込み image_data = {} for number_image in NumberImage.all().ancestor(key).filter('number in', digits): image_data[number_image.number] = number_image.data # 合成するデータの決定 image_list = [] offset = 0 for i in reversed(digits): image_list.append((image_data[i], offset, 0, 1.0, images.TOP_LEFT)) offset += 64 # 合成して出力 image = images.composite(image_list, offset, 128, output_encoding=output_encoding) if output_encoding == images.PNG: self.response.headers['Content-Type'] = 'image/png' elif output_encoding == images.JPEG: self.response.headers['Content-Type'] = 'image/jpeg' self.response.out.write(image) except ValueError, error: logging.error('invalid path') responses.display_error(self, 404)
def get(self): """ ancestorへのkeyとnumから画像を引き当てて表示する """ try: key = db.Key(self.request.get('key')) num = int(self.request.get('num')) results = NumberImage.all().ancestor(key).filter('number = ', num) if results.count() != 1: responses.display_error(self, 404) return self.response.headers['Content-Type'] = "image/png" self.response.out.write(results[0].data) except Exception, exception: logging.error(str(exception)) responses.display_error(self, 404)