2011年3月9日水曜日

web2py, plugin_wikiのeditor権限

Plugin_wikiははとても便利
サイトのページをサーバー上で直接に編集できる。
通常のページだけでなくメニューやフッターも作れます。
Python codeや{{...}}タグも使えます。ページは様々なWidgetがあってYouTubeやGoogleのchartやmapを埋め込めます。これはvimeoにも載っているのですが。What is going on with web2py?
その使い方はOnline bookに詳しいのですが、ログインしてもPageがなかなか現れませんでした。下の図のPagesというタブです。

確かこのブログで紹介しましたが、editorというgroupのメンバーがログインすると現れます。だがこれは結構に面倒です。よくBookを読んだらmail.setting.senderとログインしたユーザーのメールアドレスが同じならeditorの権限を得ることが書いてあります。
それを記録しておきます。


from gluon.tools import *
mail = Mail()                                  # mailer
auth = Auth(globals(),db)                      # authentication/authorization
crud = Crud(globals(),db)                      # for CRUD helpers using auth
service = Service(globals())                   # for json, xml, jsonrpc, xmlrpc, amfrpc
plugins = PluginManager()

mail.settings.server = 'gae'  # your SMTP server
mail.settings.sender = 'xxxxxxxx@gmail.com'         # your email
mail.settings.login = 'xxxxxxxx@gmail.com:<password>'      # your credentials or None
if auth.user:
    plugins.wiki.editor = auth.user.email == mail.settings.sender

私は一人でページを作っているのでこれで十分です。

2011年3月3日木曜日

web2py , openID,google,Facebookでログイン

非常に強力なwebのフレームです。特にGoogle App Enginesへdeployするには優れています。
Djangoからweb2pyにスイッチしたのはそのためです。

そのusers groupは非常に活発で開発者(Massimo Di Pierro)が直接に回答していること、メンバーに開発者の学生が多いことなどで非常に役に立っています。オンラインドキュメントはよく編集されていて優れています。ドキュメントで分からないこと全部このユーザーグループで検索すればほぼことは足ります。質問しなくても検索すれば大方の問題は解決します。残念ながら英語しかありませんが。

掲題のログインの問題にもどって。

web2pyは完璧な認証システムが備わっています。
さらにjanrain(user management platform for the social web)とのインタフェースがクラス(RPXaccount)として用意されているのでこれをネイティブなログインフォームに代入すればopenID,Google,openIDなどのアカウントでログインできます(janrainは商用サービスですがbasicはfreeです)。
janrainのEngageというプロダクトに好みの名前のドメインを登録するとapi_keyがもらえますから、これをRPXaccountのパラメータにして初期化してネイティブなログインフォームに代入するだけです。

 auth.settings.actions_disabled=['register','change_password','request_reset_password']
auth.settings.login_form = RPXAccount(request, api_key='もらったapi_key',domain='ドメイン',
    url = "http://localhost:8000/%s/default/user/login" % request.application)
最後の行はweb2pyのログインURLです。

これでGoogleやFacebookのアカウントをもった訪問者はログインできます。同時に訪問者の名前やメールアドレスがこちらのサイトのuserテーブルに保存されます。

しかしこのままだと今まで自分のサイトに登録した訪問者がログインできません。
そのためにExtendedLoginFormというクラスが用意されています。
argsにトークンを入れてログインフォームをスイッチできるようにしたものです。
ところがこれがduplicate keywordsになってうまく動きませんでした。
この問題はweb2pyのユーザーグルプに投稿されて解決策がhow to use ExtendedLoginForm ?に掲載されていました。
詳細は省きますが、その結果は次の画面のようになります。
web2pyには幾つかのGoogleなどのログインメソッドが用意されています。まだこれは試していません。janrainは単一のゲートウエイになっているので便利です。








画面の上半分はよそのアカウントでログイン、下半分の会員登録は自分のサイトに登録します。あるいはログインします。

Wweb2py、GAEで公開まで

私は机上のMacで研修のためのアプリケーションを開発しています。
そこでの経験をまとめておくと良いのではとおもって投稿します。 



localhost:8000 => localhost:8080 => Google App Enginesと言う具合に段階を上げています。
ポートの8000はweb2py.py、8080はGAEのシミュレータでgoogle提供のSDKです。ここで開発デバッグ、試験してGoogle App Enginesで公開にアップロードして公開します。


web2py.pyでは完全なデバッグ環境があってDjangoより格段に進歩した環境が提供されます。
トレースバックのコールシーケンスの各段階の変数のスナップショットは当然ですが、adminの画面からviewやcontollerを直接呼び出せま
す。ですから分からないことがあると、k=kという文を入れてトラップさせて自分のプログラムだけでなくweb2pyの中のうごきをトレースバックして
います(本当はもっとスマートな方法があるかもしれませんが)。
非常に便利ですが、この段階では私はデータベースにsqliteを使っていますからアプリケーション間でデータの共有ができません。ログインしても別の
アプリケーションではuserテーブルの値が別々のデータベースになるので、認証関係の設定の確認ができません。これが難点です。しかしsqliteは
SQlite Databaseブラウザーがあるのでこれで個別のデータの確認を簡単にとれます。
データベースはシミュレータで共有できるようになります。アプリケーションで共有するテーブルをそれぞれで定義しておけばOKです。userテーブルも
共有できますから、認証の確認は確実です。
データベースのブラウジングはhttp://localhost:8080/_ah/adminで作成、閲覧して編集削除することができます。
registrationではメールによるverificationをしたいのですが、私のMacのサーバーからメールを発信する方法を知りません(ど
なたかご存知でしたら教えてください)。
いまはauth_userを/_ah/adminで開いて該当するエントリのregistration keyを取り出して、http://
localhost:8080/members/default/user/verify_email/1b0cd09d-1e4c-407a-
ae8a-536ecedd80c5とやっています。
シミュレータで一通りのデータベースアクセスをします。ここでindexテーブルを全部作っておかないとGAEが動作しません。
シミュレータで試験するのはデータが共有されておこる不都合をチェックするくらいでしょうか。
最後にGAEです。
実はGoogleAppEnginesはバージョンがあってDefaultのバージョンはhttps:xxx.appspot.comで公開されます が、それ以外のバージョンは頭にバージョン番号をつけてアクセスします。https:2.xxx.appspot.comという具合です。ここでも公開までのステップが用意されています。まぁアルファバージョン、ベータバージョンということでしょう。

バージョンはapp.yamlで指定します。appspot.comでログインすると自分のGAEのアプリケーションの空間に入れます。アプリケーションのリストがありますから、該当のアプリケーションを選択してそこのversionsでデフォールトのバージョンを設定できます。

デフォールトのアプリケーションとは、私のこのアプリケーションではmaselstyle.appspot.comで呼び出されるアプリケーションです。以前のバージョンや試験中のバージョンは、それがバージョン4とすると、4.masel-style.appspot.comです。
デフォールトは利用者がアクセスしますから、デフォールト以外で試験して、OKならば、そのバージョンをデフォールトにします。これはプログラムコード

プログラムコードのバージョンとは別にデータベースの値をnamespaceでコントロールできます。
アプリケーションのdb.pyで指定します。
if request.env.web2py_runtime_gae:            # if running on Google
App Engine
    db = DAL('gae://mynamespace')             # connect to Google BigTable
mynamespaceはその名のとおり名前空間ですからデータベースの構造は同じでも違う値を持つことになります。