Google Apps Engine - Python メモ

Google Apps Engine を利用したアプリケーションを開発する際、気になった事柄についてメモを残す。

GAE-Pyhon で正規表現、マッチした文字列取得

2010/11/24 5:00 に いつかはちょうになる が投稿

GAE-Python で正規表現を利用したパターンマッチ」に続き、search を利用してマッチした文字列を取得する。


n=user.email()
d=re.search("@example\.com", n)
logging.debug(n)
logging.debug(d)
logging.debug("span:"+str(d.span()))
logging.debug("group:"+str(d.group(0)))

実行した結果は以下のようになった。
DEBUG    2010-11-24 12:59:58,311 main.py:78] test@example.com
DEBUG    2010-11-24 12:59:58,311 main.py:79] <_sre.SRE_Match object at 0x01FB8A68>
DEBUG    2010-11-24 12:59:58,311 main.py:80] span:(4, 16)
DEBUG    2010-11-24 12:59:58,311 main.py:81] group:@example.com

GAE-Python で正規表現を利用したパターンマッチ

2010/11/24 3:47 に いつかはちょうになる が投稿

GAE-Python 環境で正規表現を利用したドメインのパターンマッチをする機会があったので掲載しておく。次のサンプルではexample.com ドメインのメールアドレスのときにのみ変数dにマッチした結果が入り、マッチしない場合はNoneがはいる。


import re

n=''
if u:
n=user.email()
p=re.compile('[@example\.com]*')
d=p.match(n)



GAE-Pythonで正規表現文字列置換

2010/11/16 6:57 に いつかはちょうになる が投稿

str.replace(**,**)くらいでできるだろうと思いきや、意外と面倒で驚いた正規表現での文字列置換。今回対象となったのは、URLの正当性を判断する部分だった。単にマッチするだけでもよいのだが、どこで処理が止まったかを把握したいため、条件にマッチする部分をブランクに変換して状態を調べる方法をとった。

正規表現に絡むライブラリを利用するにはreをインポートする必要があった。これがわからず当分の間迷走していたとは口が裂けても言えない。
import re

次の一文はsrcで指定されている文字列がURLであるかどうかを判断している。"http://****"といったURL形式にマッチする部分をブランクに置き換え、残った文字列がある場合はURLではないという判断になる。尚、この正規表現で処理しようとした場合、意味不明な日本語のドメインはURLではないと判断される。また、シングルクォートが含まれてもURLではないと判断する。
if re.sub('^(https?|ftp)(:\/\/[-_.!~*()a-zA-Z0-9;\/?:\@&=+\$\,%#]+)$', '', src)!='':



GAE に Google Apps アカウントでログインできる仕組みを組み込む

2010/11/14 2:11 に いつかはちょうになる が投稿

Google Apps Engine でプログラムを作成しているとどうしてもGoogle Apps にからみのあるアプリケーションを作成したくなる。しかし、Google Account と Google Apps Account は別管理されていてログイン方法がことなる。そこで、Google Apps Account でログインできる仕組みについて調べてみた。

サイト名がドキッっとしてしまうが、以下のURLに記載していていた。


(ちなみに、Yahoo は Yahoo.com と Yahoo.co.jp ではアカウントを共有できないようなので注意が必要。)

で、お題のGoogle Apps についてですが、以下のURLに記載されていました。


ソースコードは以下の通り。赤字の部分をログインしたいドメインに変更すればApps用のログイン画面に飛ばされる。
login_urls='|<a href="'+users.create_login_url("/", "imomushi.com", "https://www.google.com/accounts/o8/site-xrds?hd=imomushi.com")+'">imomushi.com</a>'


日本語の文字列をデータストアに入れようとしたらエラーになった

2010/11/08 7:48 に いつかはちょうになる が投稿   [ 2010/11/08 7:54 に更新しました ]

日本語の文字列を開発環境のデータストアに入れようとしたらエラーになった。あれこれと試したら、なぜか何も対応していない状態でエラーがでなくなった。。。

unicode("自分のサイト").encode('utf-8');

import sys
stdin = sys.stdin
stdout = sys.stdout
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdin = stdin
sys.stdout = stdout



GAE-python環境下でURLフェッチ(他サイトの情報取得)

2010/11/08 6:26 に いつかはちょうになる が投稿   [ 2010/11/10 5:34 に更新しました ]

GAE-python環境下で開発をしている場合のURLフェッチについて。尚、URLフェッチは制限があるので計画的に利用しなければならない。

class MainPage(webapp.RequestHandler):
def post(self):
user = users.get_current_user()
if user:
self.response.headers['Content-Type']='text/xml'
p=self.request.get('p')
p=p.encode("utf-8")
query = {'q': p,
'hl': 'ja',
'output': 'toolbar'
}
urlRequest="http://google.com/complete/search?"+urllib.urlencode(query)
result = urlfetch.fetch(url=urlRequest,headers={})
self.response.out.write(result.content)

UTF8環境で稼働していて返却もUTF8で欲しい場合の処理。
class MainPage(webapp.RequestHandler):
def post(self):
user = users.get_current_user()
if user:
self.response.headers['Content-Type']='text/xml'
p=self.request.get('p')
query = {'hl': 'ja',
'xml': 'true',
'ie': 'utf_8',
'oe': 'utf_8',
'q': p.encode("utf-8")
}
urlRequest="http://google.com/complete/search?"+urllib.urlencode(query)
result = urlfetch.fetch(url=urlRequest,headers={})
self.response.out.write(result.content)

GAEでXMLを返すときにContent-Typeを明示する

2010/11/08 6:22 に いつかはちょうになる が投稿

Web系の開発においてどの言語を使っていてもこの問題につまづく。GAE Python の環境下で開発している場合、以下のコマンドを実行することでprototype.jsのresponseXMLで正常に認識してもらえるようになる。

self.response.headers['Content-Type']='text/xml'

GAE-Pythonでデバッグを効率よく行う

2010/11/06 12:21 に いつかはちょうになる が投稿   [ 2010/11/06 12:46 に更新しました ]

ログコンソールに出力することができる。

import logging


class MainPage(webapp.RequestHandler):
  def get(self):
    logging.debug("デバッグ")
    logging.info("インフォ")
    logging.warning("ワーニング")
    logging.error("エラー")
    logging.critical("クリティカル")

    user = users.get_current_user()


def main():
  #logging.getLogger().setLevel(logging.DEBUG)
  #logging.getLogger().setLevel(logging.INFO)
  #logging.getLogger().setLevel(logging.WARNING)
  logging.getLogger().setLevel(logging.ERROR)
  #logging.getLogger().setLevel(logging.CRITICAL)
  run_wsgi_app(application)



上の例だと出力結果にエラーとクリティカルのみが出力される。


開発環境のデータストアを閲覧するアドレス

2010/11/06 12:17 に いつかはちょうになる が投稿   [ 2010/11/06 12:45 に更新しました ]

開発中にデータが正しく処理されているか確認しようとした際にデータストアの内容を見たい。

直接以下のURL(ポートは要変更)にアクセスするか、ランチャーからSDK Consoleを起動する。



Python版開発環境

2010/08/02 9:01 に いつかはちょうになる が投稿

最新版ではエラーになるのでGAEが指定している2.5系を入れる。
ダウンロード先は python.org になり、バージョンは2.5.4となる。

念のためこのページの添付ファイルに2.5.4をダウンロードしたものを添付しておく。

1-10 of 19