2007年12月10日

AuthKit を普通のWSGIアプリで使う

Selectorと組み合わせてみたのだがいまいち。
Selectorはディスパッチする際に、environ中のSCRIPT_NAMEとPATH_INFOを書き換えてしまうのだが、AuthKitがログインフォームの中で、actionのURLを設定するときに、SCRIPT_NAMEを見るんだな。
例えば /mypage にディスパッチすると、SCRIPT_NAME が / から /mypage になる。
ディスパッチされた側のアプリケーションとしては、この設定が正しい。
だが、AuthKitミドルウェアは、ディスパッチ前の状態が正しいわけで、environが直接更新されてしまうと、困るのである。
/mypageの例だと、フォームのactionが/mypage/verify になってしまい、AuthKitが想定している /verifyとずれてしまう。
まあ、AuthKitミドルウェアの設定で、baseurlを変えられるのだけど、'' だとFalseと判定されて無視されるし、'/' だと、//verify とかちょっとダサいURLになる。
ホスト名から指定すればいいかと思ったら、ミドルウェア設定時には、ホスト名は動的に取得できないんだよな。
元凶は、同じenvironを見てることだと思うので、ディスパッチ時にenvironをコピーしてから、SCRIPT_NAMEやPATH_INFOを調節するようなディスパッチャを書いて試してみたらうまく動いた。
ディスパッチャは、wsgi.org にあるディスパッチャの例に、environ = environ.copy() を冒頭に追加した。

Specifications/routing args - WSGI Wiki

この辺りの例でもenvironをコピーしないようになってるのは、なにか弊害があるのだろうか。



Powered by ScribeFire.