2009年5月31日日曜日

ElementTreeを使ってXMLを読み込む

マッシュアップには欠かせない、XMLのパース方法です。
xml.etree.ElementTreeを使います。



import xml.etree.ElementTree as etree

    xml = """
<test>
  <name>sample name</name>
  <desc type='text'>sample desc</desc>
  <option>
    <value>value1</value>
  </option>
  <option>
    <value>value2</value>
  </option>
  <option>
    <value>value3</value>
  </option>
</test>
    """

    elem = etree.fromstring(xml)
    self.response.out.write( '<br />name=' +  elem.findtext('name') )
    self.response.out.write( '<br />desc=' + elem.findtext('desc'))
    self.response.out.write( '<br />desc=' + elem.find('desc').text)
    self.response.out.write( '<br />desc type=' + elem.find('desc').get('type') )

    for opt in elem.findall('option'):
      self.response.out.write('<br />option ' + opt.find('value').text )   


2009年5月17日日曜日

Google Accounts のユーザー名は表示できない?

Google Accounts というGoogle の認証システムを使える便利な機能があるのですが、、、
http://code.google.com/appengine/docs/python/users/

これを使って、利用者本人を認証する分にはまったく問題ないのですが、
例えば、投稿データをこのUserクラスと関連づけようとすると問題が出てきます。

初期化のための変数が、emailアドレスしかないんですね。
ということは、ユーザー○○の投稿一覧ページなんかを作ろうとすると、
URLにemailアドレスを入れないといけない?
ということになってしまうような。。。

さらにnicknameというプロパティがあるのですが、
これもemailアドレスの@の前部分が返ってくるだけだし、
変更する機能なども特にサポートされていないようなんですね。

なので、何も考えずにユーザー投稿サイトを作ってしまうと、
gmailアドレスがダダ漏れなサイトになってしまいます。

emailアドレスは独自の暗号化して復元できないようにして、
nicknameは独自の編集機能を設けて
と自分で作り込むしかなさそうです。

Google Friend Connectとの連携が簡単にできるようになったりしないですかね?

2009年5月9日土曜日

unicodeとstringだけじゃない、db.Textはまた別です

UnicodeとStringが別物という話はpythonの世界では有名なようですが




Unicode で萎えそうになったとき(orz)に思い出してほしい5つのこと - Solr, Python, MacBook Airより引用:


Unicode 関係でモヤモヤしたら思い出してください。





GAEにはもう一つテキストを表す型があります。
ストレージに長い文字列を保管することができるTextPropertyがそれです。
一見するとStringと同じように動作するので紛らわしいのですが、直接Unicodeに変換することができず、一度stringに変換してあげる必要がありますので注意が必要です。



from google.appengine.ext import db

text = db.Text(u'あいうえお')

#これはエラー
#print text

#stringへ変換はOK
str = text.encode('utf-8')
print type(str) #

#unicodeへ直接変換できない
#uni = text.decode('utf-8')

#stringへencodeしてからdecodeしてunicodeへ変換可能
uni = text.encode('utf-8').decode('utf-8')
print type(uni)

Google App Engine で開発してみよう

app engine でいろいろ開発してみようと思います。
開発の途中で調べたこと、作ったものなどのtipsをまとめていこうと思います。