Amazon

2010年12月30日木曜日

CodeZineのDjangoチュートリアル後編にてCSRF verification failed.になる

CodeZineのDjangoチュートリアル(後編)の4にて。
商品検索フォームを作って、フォームに検索クエリを入れて検索をしたところ

"Forbidden(403) CSRF verification failed. Request aborted."が表示されてしまい、結果が正しく表示されない。


どうもCSRFはCross Site Response Forgeriesの略で、要はWebサイトにスクリプトや自動転送(HTTPリダイレクト)を仕込むことによって、閲覧者に意図せず別のWebサイト上で何らかの操作(掲示板への書き込みなど)を行わせる攻撃手法のことらしい


DjangoではCSRF対策として、POSTリクエストに対して、以下の対策をしていないとForbidden 403 errorを返すよう。

  • The view function uses RequestContext for the template, instead of Context.
  • In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.
  • If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.
これの3番目を読む限り、CsrfViewMiddlewareクラスを利用するかcsrf_tokenを使用するようにとのこと。


そこで、settings.pyの"MIDDLEWARE_CLASSES"に以下の一行を追加することでこのエラーを回避できる。
'django.middleware.csrf.CsrfResponseMiddleware',


これでPOSTリクエストに対してCSRF対策がされる。
実際はPOSTリクエストに対して隠しフィールドが追加されてセッションIDと隠し文字列の和のハッシュ値が送信され、それをチェックすることで、正規のリクエストかを判断しているとのこと。

学ばなきゃいけないことは色々ありますねぇ。。。

2010年12月28日火曜日

AptanaでDjango Projectの実行

まだ使い慣れないAptanaでDjango Projectの実行で一部ハマったのでメモ。

1. PyDev Django Projectを作成
Pydev Package Explorer上で右クリックしてNew->ProjectでPydev->Pydev Django Projectを選択

2. 参照するプロジェクトの選択
参照するプロジェクトを聞かれるが今回初めて作るので、特に選択せずに"Next >"

3. Djangoのバージョンとデータベース設定
Django versionを1.2 or laterとし、Database Engineをsqlite3を選択

4. Webサーバーのテスト
PyDev Package Explorerから作成したプロジェクトを選択して、メニューバーのRun->Run Configurationを選択
 右側"Pydev Django"をダブルクリックしてNew_configurationを作成。
Projectは"Browse"をクリックして、作成したプロジェクトを選択。
Main Moduleは"Browse"をクリックして、作成したプロジェクトの中にあるmanage.pyを選択

"Arguments"タブに移動して"Program arguments"に"runserver localhost:8001 --noreload"を記入して"Run"をクリック。

ここでの引数の意味は
localhost:8001 localhostの8001番でWebサーバーを起動させる
--noreload      サーバの稼働中にいかなる Python コードの変更も検知せず既にメモリ上に読み込まれている Python モジュールを利用する

今回はテストなので--noreloadをつけているが、開発の過程ではWebサーバーは起動しっぱなしにして適宜コードを修正してテストすることになるので、このオプションははずす。
その他の引数に関しては、Djangoのマニュアルを参照




しばらくするとConsoleにDevelopment server is running at http://localhost:8001/ が表示され、Webサーバーが起動したことがわかる。

ブラウザでhttp://localhost:8001/ にアクセスしてみるとIt worked!というページが表示されれば、起動確認完了。


とりあえず何でハマったかというと、"runserver"をどこから指定すればよいかわからなかったところ。というのも、Pydev Package Explorer上でプロジェクトを右クリックし Django-> custom command (manage.py ${custom_command})とあるので、これをクリックし

コマンド入力のウィンドウで"runserver"と入力して"OK"をクリックしたところ

ステータスバーに"Refresh on finish"が表示されたままConsoleには何も表示されず15分くらい待っても変化なし。


マニュアル読めって感じですかね。。。






PythonのWebアプリケーション開発環境(Aptana + PyDev)

Webアプリケーション開発にあたり前回までにCentOSのセットアップPython+Djangoのセットアップを行った。

次に統合開発環境(Integrated Development Environment :IDE)として何を使うか?
ひとまずEclipseにプラグインを入れ込んでいけば何とでもなるのだけど、余分なプラグインで重くなるのは嫌なので、とりあえず出来上がってる開発環境を使おう。

WebアプリケーションということでHTMLやCSSの編集機能は絶対必要になるので、HTML/XML/CSS/JavaScriptの統合開発環境であるAptanaを候補に考えていたら、Pythonの開発用プラグインとしてPyDevがあるようです。他にもRuby On Railsの開発用プラグインとしてRadRailsがあったり、Adobe AIR開発用プラグインがあったりと、Webアプリケーション開発環境としてはかなり充実している様子。

Windows環境へのインストール手順と利用方法は以下の通り。

1. Aptanaをダウンロード
Aptana Studioのサイトからイメージをダウンロード。今回は"Standalone Version"を選択

2. インストーラーを実行してインストール
1でダウンロードしたAptana_Studio_Setup_2.0.5.exeをダブルクリックしてインストール

3. Aptana起動
インストールが完了したらデスクトップにできたAptana Studio 2.0のアイコンをダブルクリックして起動

4. Aptana My Studioの表示
Aptanaを起動するとMy Studioというタブが表示される。もし表示されていなければメニューバーのウィンドウ->My Studioで表示される


5. PyDevのインストール
My StudioタブでPluginsという項目をクリックし、その中のPlatformタブのAptana PyDevの"Get it"をクリックするとプラグインのインストールウィザードが起動する。

PyDevの項目にチェックを入れて"Next >"。(PyDev Mylyn Integrationはオプション)インストールするプラグインの一覧が表示されるので確認して"Next >"。プラグインの使用許諾が表示されたら中身を確認して問題がなければ"I accept the terms of the license agreements"にチェックを入れて"Finish"。再起動したらインストール完了。

6. PyDevのパースペクティブ(開発画面)を確認
Aptanaが再起動したら右上のパースペクティブの選択項目の中に"PyDev perspective"画追加されているのを確認し、クリックしてPyDevパースペクティブを開く。もし追加されていなければ"Open Perspective"のボタンをクリックしてPyDevのパースペクティブを開く。


これでインストール完了なので、あとは.pyのファイルをドラッグ&ドロップで持ってこればコードアシスト機能が使えるようになる。

次回はこのPyDevを使ってGoogle App Engine Projectを作成してみよう。

2010年12月24日金曜日

PythonとDjangoのセットアップ

昨日色々とWebアプリケーションフレームワークと開発言語を調べていて、世界的利用者の数の多さと可読性の観点からPythonを使おうと決めた。そして、PythonのWebアプリケーションフレームワークとしてメジャーなDjangoを早速入れてみる。

ひとまずWindows環境に入れてみよう。参考にするサイトはこちら
Pythonのバージョンは2.7.1とし、Djangoのバージョンは1.2.4

1. Pythonのダウンロード&インストール
2.7.1のmsiをダウンロードしてきて、インストール。インストール先はC:\Python2.7
マイコンピュータ右クリック->プロパティ->詳細設定->環境変数
システム環境変数のpathに
C:\Python2.7:C:\Python27\Tools\Scripts
を追加

2. Djangoのダウンロード&インストール
1.2.4のtar.gzをダウンロードしてきて、解凍。
コマンドプロンプトから解凍したフォルダに移動し、
python setup.py install
でインストール開始。その後、

  • C:¥Python27¥Lib¥site-packages
  • C:¥Python27¥Scripts¥django-admin.py
がコピーされる。


3. Projectの作成
適当にフォルダを作成C:\DjangoSample
> django-admin.py startproject ecsite
とするも、django-admin.pyが見つからないと怒られる。
先ほど環境変数に設定したのは"C:\Python27\Tools\Scripts"であり、django-admin.pyのある"C:\Python27\Scripts"ではないから、そりゃ見つからないわな。
ということで環境変数pathに"C:\Python27\Scripts"を追加し、コマンドプロンプトを再起動
もう一度C:\DjangoSampleにて
> django-admin.py startproject ecsite
を実行すると見事__init__.py, manage.py, settings.py, urls.pyの4つのファイルが生成される


4. アプリケーションサーバーの実行
ecsiteフォルダに移動し、
>C:\DjangoSample\ecsite>manage.py runserver

を実行すると
>Validating models...
>0 errors found
>
>Django version 1.2.4, using settings 'ecsite.settings'
>Development server is running at http://127.0.0.1:8000/
で待機状態になるので、ブラウザでhttp://127.0.0.1:8000/にアクセスすると
> [24/Dec/2010 16:50:40] "GET / HTTP/1.1" 200 2051
となり、ブラウザでも"It Worked!"というページが表示されれば無事成功。


5. sql作成
settings.pyファイルを開き、DATABASESのENGINEをsqlite3に変更し、Nameをフルパスで指定。TIME_ZONEをAsia/Tokyoにし、LANGUAGE_CODEをjaにする。

DATABASES = {
    'default': {
        'ENGINE': 'sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'C:\\DjangoSample\\ecsite\\ecsite.sqlite',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}


TIME_ZONE = 'Asia/Tokyo'


LANGUAGE_CODE = 'ja'




その後
> manage.py syncdb
コマンドでDBを初期化。
初めて作成するとスーパーユーザーがいないから作成するかと聞かれるのでyesとし、名前とメールアドレスとパスワードを入力する。

C:\DjangoSample\ecsite>manage.py syncdb
>Creating table auth_permission
>Creating table auth_group_permissions
>Creating table auth_group
>Creating table auth_user_user_permissions
>Creating table auth_user_groups
>Creating table auth_user
>Creating table auth_message
>Creating table django_content_type
>Creating table django_session
>Creating table django_site
>
>You just installed Django's auth system, which means you don't have any superusers defined.
>Would you like to create one now? (yes/no): yes
>Username (Leave blank to use 'administrator'): admin
>E-mail address: admin@gyk.com
>Password: 
>Password (again): 
>Superuser created successfully.
>Installing index for auth.Permission model
>Installing index for auth.Group_permissions model
>Installing index for auth.User_user_permissions model
>Installing index for auth.User_groups model
>Installing index for auth.Message model
>No fixtures found.


6.sqlite3のインストール
SQLiteのサイトからsqlite-shell-win32-x86-3070400.zipをダウンロードして解凍し、sqlite3.exeをC:\sqlite3フォルダに移動させてこのパスを環境変数に追加
> manage.py dbshell
でsqliteの対話モードに入ったら、SELECT文などでテーブルに格納されているデータやテーブルの構造なども含むデータベースに関する情報をSQL文の形式で一度出力してみる。これをダンプという。
sqlite>.dump


7. アプリケーションの作成
プロジェクトフォルダにてコマンドプロンプトから
> manage.py startapp itempage
にて、__init__.py, models.py, tests.py, views.pyが作成される
続いてDjangoにアプリケーションを認識させるためにsettings.pyのINSTALLED_APPSの項目に作成したアプリケーション名(ecsite.itempage)を追加する

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'ecsite.itempage'
)


8. モデルの作成
「モデルは基本的にデータベースの1テーブルと対応し、フィールドはDBテーブルの1カラムにマッピング」
実際に作成するモデルはmodels.pyに記述する。記述内容は参考サイトのまんま


9. モデルをHTMLに表示
テンプレートを作成するフォルダを適当に作成し(C:\DjangoSample\templates)、settings.pyのTEMPLATE_DIRSに記述。
実際のテンプレートとなるitem.htmlはpage/item.htmlに配置。
URLディスパッチャをurls.pyに定義。URLディスパッチャで定義したメソッドをビュー関数views.pyに記述。


以上、簡単なお買い物ECサイト構築。
確かに簡単に作れる気がする。pythonをもっと勉強しなければいけないけれども。






2010年12月23日木曜日

LAMPのPはPHP, Perl, Python, Rubyのどれにする?

昨日CentOSのインストールが終わったので、これからLAMP環境を構築しようと思っています。
そこでよくあるのがLAMPの"P"をどれにするか?ってこと。

大学の頃RubyとPerlを使っていたけれど、Perlよりも断然Rubyの方が書きやすかった印象がある。
というよりコードが読みやすかった。その頃Pythonという言語を初めて知ったのだけど、外国の話だと思って完全無視してた。

さて、Perl, Python, Rubyの比較として"Perl, Python, Rubyの比較"というサイトではPythonを推している感があるが、こちらのサイトではそうでもないと指摘している。グリーやモバゲーではPHPが使われているし、GoogleではPythonだ。

Webアプリケーションフレームワークとして、PHPはCakePHP、PerlはCatalyst、PythonはDjango、RubyはRuby on Railsがメジャーどころのようですが、どれも一長一短でどれが一番かなんてのは不毛な議論のようだ。

結局、エイヤで決めちゃえばいいだけの単純な話なのかもしれない。

個人的に思い入れのあるRubyも捨てがたいけど、新しい挑戦ということでPythonにしよう。
#Pythonは日本語周りでハマるという話が多々あるけど、逆にハマった人が多い方が情報は見つけやすそうだ。

2010年12月22日水曜日

CentOS5ネットワークインストールしてみた

これからWebアプリケーション開発するにあたり、いわゆるLAMP環境(Linux, Apache, MySQL, Python)を用意しておこうと思い、RedHat Enterprise Linux(RHEL)と互換性のあるCommunity Enterprise Operating System(CentOS)をVM使ってインストールしてみる。

特にCentOSに格段の理由があるわけではないけど
とりあえず無償で使えて安定性のあるOSということで。

ダウンロードはCentOS.orgから。
どうもCD imageで7枚かDVD imageで1枚のようだけど3.9GBもあるのでdownloadを待つのが大変だし、PCのディスク容量をあまり使いたくないので、ネットワークインストールにする。

イメージをダウンロードしたらVMware Playerを使ってImageのインストールを開始。特に明記しない場合は初期設定のまま変更をせず。

まず起動してくるのがCentOSのスタート画面

インストールの言語設定

日本語が表示できないというのでEnglishになるよ、と。

キーボード設定

インストール方法の選択。ネットワークインストールなので"FTP"を選択


ネットワーク設定。IPv4のDHCPを選択

FTPサイトの設定。ここではftp.riken.jp, /Linux/centos/5/os/i386を設定し、Use non-anonymous ftpのチェックをはずす

あとは自動でネットワーク経由でイメージを取得してきてくれる

インストールイメージが取得できたらインストールが開始される

ディスクフォーマットの確認

インストールパーティションの確認。とりあえず初期設定のまま。

パーティション削除の確認

ネットワーク設定

ロケーション設定

rootのパスワード設定

インストールするコンポーネントの選択。ひとまずGnomeのDesktop

インストール準備完了

パッケージのインストール開始


VMでやったせいかインストールに1時間くらいかかったけど無事完了。再起動。

あとは細かい設定。

このLinuxにリモートから接続する際の方法。初期設定のSSHを選択

日付はネットワークタイムプロトコル(ntp)を使用。

root以外のユーザーを作成。

サウンドカードノ設定。但し、VMのせいか上手くいかなかったのでほったらかし。



設定も終わってログイン画面


これでCentOS5のインストール完了。

次回はLAMP環境のセットアップを予定。
それよりもGoogle App Engine(GAE)の利用方法が先かな。








Amazon3