Django の環境を Windows 上の Eclipse + PyDev で作ってみた
今まで python で書くときは vim のみだったのだが、今回は Ecplise + PyDev を使ってみることにした。Eclipse の vim plugin の Vrapper は使ってるけどね。
まず Python をインストール。ダウンロードして実行するだけなので割愛。
Ecplise と PyDev のインストールも割愛ww
この辺りを参考にしましょう → Pydevのインストールをした際の手順
ちなみに俺は http://mergedoc.sourceforge.jp/ の Pleiades All in Oneパッケージを使ってます。バージョンは Galileo の 3.5.2。
次に Django をここからダウンロード。
解凍して、コマンドプロンプトを起動して、そのフォルダに移動後、以下のコマンドを実行。
>>> django.VERSION
これで準備が整ったはずなので Ecpliseを起動して、ファイル → 新規 → プロジェクトで、Pydev以下にある Pydev Django Project を選択して、次へ。
プロジェクト名を入力して、他はデフォルトの設定で、次へ。
っと、ここで Django がインストールされてないと Ecplise に文句を言われる。。。
色々調べてもわからなかったがw、試しにウィンドウ → 設定から、Pydev → インタープリター python を選んで、ライブラリタブに django-admin.py がある pythonのフォルダ直下の Script というをフォルダを追加してみたら認識したので、これで良しとするww
再度、上記の手順でプロジェクトを作ってみた。そうすると最後に以下のデータベースの設定を聞かれる。とりあえず、python2.5以降にはデフォルトで sqliteが入ってるそうなんで、sqliteを選んでみた。
これで、プロジェクトが作成されたので、実行 → PyDev: Django を選んでみると、
以下のようなメッセージが出たので、
Validating models...
0 errors found
Django version 1.2.4, using settings 'DjangoTest.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
ブラウザでアクセスしてみると、
It worked!
Congratulations on your first Django-powered page.
と無事表示された。めでたしめでたし。
でも、このメッセージのすぐ下にこんなことが書いてある。
Of course, you haven't actually done any work yet.
はいはい、インストールしただけですね^^
まず Python をインストール。ダウンロードして実行するだけなので割愛。
Ecplise と PyDev のインストールも割愛ww
この辺りを参考にしましょう → Pydevのインストールをした際の手順
ちなみに俺は http://mergedoc.sourceforge.jp/ の Pleiades All in Oneパッケージを使ってます。バージョンは Galileo の 3.5.2。
次に Django をここからダウンロード。
解凍して、コマンドプロンプトを起動して、そのフォルダに移動後、以下のコマンドを実行。
{pythonをインストールしたパス}\python.exe setup.py install
インストールが終了したら、Python のインタラクティブシェルを起動して、Django が正しくインストールできたか確認。
>>> import django>>> django.VERSION
これで準備が整ったはずなので Ecpliseを起動して、ファイル → 新規 → プロジェクトで、Pydev以下にある Pydev Django Project を選択して、次へ。
プロジェクト名を入力して、他はデフォルトの設定で、次へ。
っと、ここで Django がインストールされてないと Ecplise に文句を言われる。。。
色々調べてもわからなかったがw、試しにウィンドウ → 設定から、Pydev → インタープリター python を選んで、ライブラリタブに django-admin.py がある pythonのフォルダ直下の Script というをフォルダを追加してみたら認識したので、これで良しとするww
再度、上記の手順でプロジェクトを作ってみた。そうすると最後に以下のデータベースの設定を聞かれる。とりあえず、python2.5以降にはデフォルトで sqliteが入ってるそうなんで、sqliteを選んでみた。
- Database Engine - 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle' から選べる
- Database Name - データベース名。SQLiteの場合、絶対パス名存在しない場合、初回自動的に作成される。
- User name - データベースユーザー名。SQLiteの場合不要
- Password - データベースパスワード。SQLiteの場合不要
- Database Host - データーベースのホスト。設定しない場合、物理的に同じマシンとみなされる。SQLiteでは不要
- Database Port
これで、プロジェクトが作成されたので、実行 → PyDev: Django を選んでみると、
以下のようなメッセージが出たので、
Validating models...
0 errors found
Django version 1.2.4, using settings 'DjangoTest.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
ブラウザでアクセスしてみると、
It worked!
Congratulations on your first Django-powered page.
と無事表示された。めでたしめでたし。
でも、このメッセージのすぐ下にこんなことが書いてある。
Of course, you haven't actually done any work yet.
はいはい、インストールしただけですね^^
Content-typeに気をつけろ
ずーっと動いてると思った ajaxでのファイルのアップロードが、Windows版の Chromeだけで動いてなかった(汗
Linux版の Chromeで動いてたから気づかなかったよ。。。
なんか、Uncaught: SyntaxError とか出てた。eval()のところで。
色々調べてみたら、jsonを evalするなら、Content-typeに application/jsonを指定しなきゃいけないみたい。そんなんで挙動変わんのかよ、と半信半疑でやったら動いたよw
しかし、chrome、お堅いなあ。。。
Linux版の Chromeで動いてたから気づかなかったよ。。。
なんか、Uncaught: SyntaxError とか出てた。eval()のところで。
色々調べてみたら、jsonを evalするなら、Content-typeに application/jsonを指定しなきゃいけないみたい。そんなんで挙動変わんのかよ、と半信半疑でやったら動いたよw
しかし、chrome、お堅いなあ。。。
urlfetch が使うソースIPアドレス
あるサイトにログインしてデータをポストするアプリを GAE/pythonで作っていて、出来たー、と思ってホッとしてたら、ローカルでは動作するけど、uploadして、プロダクションサーバーでは動かないことが判明><
調べてみると、そのサイトは cookieにJSESSIONIDというセッションIDを返してくるのだけれど、ローカルで動かしているときはログイン後は常に一定の値を返してくるのに、プロダクションサーバーでは、ログイン時に返してきたのと次にアクセスしたときに返してくるIDが違うので、セッションエラーが返ってきているのがわかった。
ローカルとプロダクションサーバーの違いは、IPアドレスと HTTPヘッダーくらいだろうから、はじめはキャッシュの問題かと思い、Cache-Control: no-cache,max-age=0 と、Pragma: no-cacheをつけてみたが、状況は変わらず。
あとは、IPアドレスくらいかー、と思い調べてみると、app engineでは、httpリクエストごとに異なるマシンからリクエストが投げられていることが判明。つまり、urlfetchのソースIPアドレスは、固定ではなく、リクエストの度に違うアドレスになる。しかも、IPアドレスのレンジが広い広いw。クラスCどころではないみたい。。。さすが Google様のクラウドであらせられます。
よって、恐らくそのサイトはセッションハイジャックを防ぐために I.P.address等でセッションを管理してるのだろうなあという考えに達した。
これを回避するために手始めに Connection: keep-alive をつけてみたけど、そんなに甘くないねw。次に proxyをかませればいいかなと思ったんだけど、GAE/pythonでは、urllibとかを使っても最終的に urlfetchに行き着くみたいで proxyをかませる方法はないらしい。。。(ローカルの場合は、ソースをいじれば可能みたいです)
かなり困って色々漁ったところ、この記事を発見!Proxying URL fetch requests from the Google App Engine
俺の場合、トラフィックは全く気にしなくていいので、VPSサーバーを借りる必要なんてなく、同じような中継するプログラムを作って、ふつーのレンタルサーバー上に置いてアクセスしてみた。
すると、なんということでしょう!
動きましたよー。はあ〜、良かったわー。
しか〜し、色々と実験中に urlfetchを follow_redirects=Falseとしてアクセスし、自前でリダイレクトすれば、中継しなくても問題なく元のサイトにアクセスできることがわかった。。。orz
それもこれも、PHPで作った中継プログラムで、curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); が効かなかったお陰なんだけどw
今までの苦労はなんだったんだと思ったけど、とにかく解決できてよかった。
これで、そのサイトは I.P.adress等でセクションハイジャックなどを防ぐようなことはしていないと思われるけど、なぜ follow_redirects=Trueで動かないのは謎のままだなあ。リダイレクト時にクッキーとかのヘッダー情報をちゃんと渡してないんじゃないのー?
PHPは勝手にドットやスペースをアンダースコアに変換する
最近は、俺のハマりメモになってるなあw
GAEの問題を回避するためにちょこっとした、PHPのスクリプトを書いてみたんだけど、意図したとおりに動かない。
うーん、うーん、と悩んだ挙句にみつけたのは、よーく見てみたら、login.nameとかでポストしてフォームのデータが、$_POSTから読んでみると、なぜか login_nameとかになっているではないか。。。
調べてみると、PHPでは、「変数名のドットやスペースはアンダースコアに変換されます。」だと(怒
PHP界隈では、こんないい加減な解決方法がゆるされるの?ドットとアンダースコアが混ざってたら元に戻せないじゃん。。。かなり長いことプログラム書いてるけど、こんないい加減な仕様がまかり通ってるのには驚いたわ。。。
で、安易に _を .に戻したくなかったので、元のデータを取得する方法を探し回ったら見つかりました。。。
勝手に $_POSTとかに入れなくていいから、生のデータをよこす関数と加工する関数を用意してくれるだけでいいんですけどねー。
GAEの問題を回避するためにちょこっとした、PHPのスクリプトを書いてみたんだけど、意図したとおりに動かない。
うーん、うーん、と悩んだ挙句にみつけたのは、よーく見てみたら、login.nameとかでポストしてフォームのデータが、$_POSTから読んでみると、なぜか login_nameとかになっているではないか。。。
調べてみると、PHPでは、「変数名のドットやスペースはアンダースコアに変換されます。」だと(怒
PHP界隈では、こんないい加減な解決方法がゆるされるの?ドットとアンダースコアが混ざってたら元に戻せないじゃん。。。かなり長いことプログラム書いてるけど、こんないい加減な仕様がまかり通ってるのには驚いたわ。。。
で、安易に _を .に戻したくなかったので、元のデータを取得する方法を探し回ったら見つかりました。。。
function getRealPOST() {
$pairs = explode("&", file_get_contents("php://input"));
$vars = array();
foreach ($pairs as $pair) {
$nv = explode("=", $pair);
$name = urldecode($nv[0]);
$value = urldecode($nv[1]);
$vars[$name] = $value;
}
return $vars;
}
勝手に $_POSTとかに入れなくていいから、生のデータをよこす関数と加工する関数を用意してくれるだけでいいんですけどねー。
GAE/python のモジュール名
ずーっとローカルな開発環境で作ってた app engine のアプリをプロダクションサーバーにアップロードしてホッとしていたところ、一部の機能が動かないとの連絡が。。。
調べてみると、
App Engine: AttributeError: 'module' object has no attribute 'メソッド名'
という exceptionがログに刻まれていた。
なぜか、そのモジュールが含まれていたファイルがアップロードされていないかのような症状が発生している。
そのファイル名は、site.py だったんだけど、pythonには元から site って言う名前のモジュールがあるんだねー。結局、これと名前がかぶってたからそっちを見に行っちゃってて、そりゃー俺が作ったメソッドなんかあるわけもなくてexceptionが発生していたってわけだ。
こんな問題ローカルで作ってる時とかでもわかると思うんだけど、なんで教えてくれないんだよー。ネームスペースとかってどうなってんだ?と思って調べてみたところ、カレントディレクトリにあるモジュールが先に呼ばれるらしい
、って当たり前なわけだが。すると、GAEの問題かー。
まあ、またまた自分へのメモでしたw
調べてみると、
App Engine: AttributeError: 'module' object has no attribute 'メソッド名'
という exceptionがログに刻まれていた。
なぜか、そのモジュールが含まれていたファイルがアップロードされていないかのような症状が発生している。
そのファイル名は、site.py だったんだけど、pythonには元から site って言う名前のモジュールがあるんだねー。結局、これと名前がかぶってたからそっちを見に行っちゃってて、そりゃー俺が作ったメソッドなんかあるわけもなくてexceptionが発生していたってわけだ。
こんな問題ローカルで作ってる時とかでもわかると思うんだけど、なんで教えてくれないんだよー。ネームスペースとかってどうなってんだ?と思って調べてみたところ、カレントディレクトリにあるモジュールが先に呼ばれるらしい
、って当たり前なわけだが。すると、GAEの問題かー。
まあ、またまた自分へのメモでしたw
