Amazon

ラベル Django の投稿を表示しています。 すべての投稿を表示
ラベル Django の投稿を表示しています。 すべての投稿を表示

2011年10月10日月曜日

Djangoテンプレートの埋め込みタグ

Django埋め込みタグリファレンスより

よく使いそうなものをピックアップ

now

指定したフォーマット文字列にしたがって現在の日時を表示します。
フォーマット文字列中で普通の文字列を使いたければ、バックスラッシュでエスケー プできます。下の例では、"f" が時刻を表すフォーマット指定子として解釈されな いようにエスケープしています。 "o" はフォーマット指定子ではないのでエスケー プしていません:
It is {% now "jS F Y H:i" %}
It is the {% now "jS o\f F" %}
フォーマット文字 説明 出力例
a 'a.m.' または 'p.m.' (Associated Press に合わせるため、'.' が入っている点 が PHP と違います)。 'a.m.'
A 'AM' または 'PM' です。 'AM'
b 3 文字の小文字で表した月名です。 'jan'
B 実装されていません。  
d 月の中の日。 2 桁のゼロ詰めです。 '01' から '31'
D 週の中の日。 3 文字のテキスト形式です。 'Fri'
f 12 時間表記の時と分。ただし、ゼロ分の 場合には表示しません。独自の拡張です。 '1', '1:30'
F 月名を長いテキスト形式で表したものです。 'January'
g 12 時間表記の時。ゼロ詰めはしません。 '1' から '12'
G 24 時間表記の時。ゼロ詰めはしません。 '0' から '23'
h 12 時間表記の時です。 '01' から '12'
H 24 時間表記の時です。 '00' から '23'
i 分です。 '00' から '59'
I 実装されていません。  
j 月の中の日。ゼロ詰めしません。 '1' から '31'
l 週の中の曜日。長いテキスト形式です。 'Friday'
L 閏年かどうかを表すブール値です。 True または False
m 月です。2 桁でゼロ詰めしたものです。 '01' から '12'
M 月です。3 文字のテキスト形式です。 'Jan'
n 月です。ゼロ詰めしません。 '1' から '12'
N Associated Press スタイルの月の省略表記 です。独自の拡張です。 'Jan.', 'Feb.', 'March', 'May'
O グリニッジ標準時からの時差です。 '+0200'
P 時刻です。12 時間表記の時、分、 そして 'a.m.'/'p.m.' です。分がゼロの 場合には省略され、必要に応じて 'midnight' または 'noon' になります。 独自の拡張です。 '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
r RFC 2822に従ったフォーマットの日時です。 'Thu, 21 Dec 2000 16:01:07 +0200'
s 秒です。 2 桁のゼロ詰めです。 '00' から '59'
S 月の中の日につける 2 文字の序数接尾辞 です。 'st', 'nd', 'rd' or 'th'
t 月の日数です。 28 から 31
T 計算機のタイムゾーン設定です。 'EST', 'MDT'
U 実装されていません。  
w 週の中の曜日です。ゼロ詰めしません。 '0' (Sunday) to '6' (Saturday)
W ISO-8601 に従った年の中の週番号です。 週は月曜日から始まります。 1, 53
y 2 桁の年です。 '99'
Y 4 桁の年です。 '1999'
z 年の中の日 0 から 365
Z タイムゾーンオフセットを秒であらわした ものです。UTC よりも西側のタイムゾーン値 は全て負の値になり、東側の値は常に正に なります。 -43200 から 43200

include

テンプレートをロードして、現在のコンテキストを使ってレンダリングします。あ るテンプレートに別のテンプレートを取り込む ("include") 方法の一つです。
テンプレート名はハードコードされた (引用符で囲った) 文字列でもよく、引用符 は一重でも二重でもかまいません。
以下の例では、 "foo/bar.html" という名前のテンプレートを取り込みます:
{% include "foo/bar.html" %}
次の例では、 変数 template_name に入っている名前のテンプレートを取り込 みます:
{% include template_name %}
取り込まれたテンプレートは、取り込んだ側で使われているコンテキストの下でレ ンダリングされます。下の例では "Hello, John" を出力します:
  • コンテキスト: 変数 person"john" に設定
  • テンプレート:
    {% include "name_snippet.html" %}
  • name_snippet.html テンプレート:
    Hello, {{ person }}
{% ssi %} も参照してください。

cycle

Django 1.0 で変更されました: タグを処理するごとに、指定した文字列や変数を循環して返します。
ループの中では、ループごとに指定した文字列や変数を循環して返します:
{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' rowvar %}">
        ...
    </tr>
{% endfor %}
ループの外側では、最初に一意な名前を与えておき、以後はその名前を使います。 例えば:
<tr class="{% cycle 'row1' 'row2' rowvar as rowcolors %}">...</tr>
<tr class="{% cycle rowcolors %}">...</tr>
<tr class="{% cycle rowcolors %}">...</tr>
任意の個数の値を使えます。値はスペースで区切ります。値をクオート (') または二重クオート (") で囲むと、文字列リテラルとして扱います。 クオートされていない値はコンテキスト変数への参照とみなされます。
値をカンマで区切った形式もつかえます:
{% cycle row1,row2,row3 %}
ただし、この構文では、値は全てリテラルテキストとして扱われます。 カンマを使った構文は以前のバージョンとの互換性のために残されています。 新たなプロジェクトでは使わないようにしてください。

for

アレイの各要素に渡ってループします。例えば、アスリート (athlete) のリストを athlete_list で渡して表示するには:
<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
{% for obj in list reversed %} のようにすると、リストに対して逆順のルー プを実行できます。
Django 1.0 で新たに登場しました.
リストのリストにわたってループ処理を行う場合、各サブリストをアンパックして、 個別に名前を割り当てられます。例えば、座標 (x, y) のリストが入った points というコンテキスト変数があり、各座標を出力したい場合には以下のよ うにします:
{% for x, y in points %}
    座標 {{ x }},{{ y }} が登録されています。
{% endfor %}
この方法は、辞書の各要素にアクセスしたい場合にも便利です。例えば、コンテキ スト変数 data に辞書が入っている場合。以下のようにすれば辞書内のキーと 値を表示できます:
{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}
for ループは、ループの各回ごとに使える変数を設定します:
変数名 説明
forloop.counter 現在のループ回数番号 (1 から数えたもの)
forloop.counter0 現在のループ回数番号 (0 から数えたもの)
forloop.revcounter 末尾から数えたループ回数番号 (1 から数えたもの)
forloop.revcounter0 末尾から数えたループ回数番号 (0 から数えたもの)
forloop.first 最初のループであれば True になります
forloop.last 最後のループであれば True になります
forloop.parentloop 入れ子のループの場合、一つ上のループを表します 




 

2011年8月1日月曜日

Google App Engineでテンプレートを使用する際の注意点

Google App EngineではDjangoを利用することができる。
テンプレートを使う時はテンプレートフォルダを作って、そこにHTMLのひな形ファイルを作成して使用する。

ファイル構成例
tmpl/hello.html
app.yaml
main.py

class TestHandler(webapp.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'application/xhtml+xml; charset=Shift_JIS'
        template_values = {
            'app_id': "test",
            'user_info': "userinfo",
        }
  
        path = os.path.join(os.path.dirname(__file__), 'tmpl/hello.html')
        self.response.out.write(template.render(path, template_values)) 
 


但し、一つ注意するのが、テンプレートファイルは静的ファイル扱いではなくスクリプトファイル扱いとなるので、app.yamlに
- url: /tmpl
  static_dir: tmpl
ではなくて
 - url: /tmpl
  script: tmpl/(.html)
とする。
そうしないとTemplateDoesNotExist: hello.htmlというエラーが出る。

2011年2月20日日曜日

GAEとDjangoと

GAEで開発するためにローカルでテストしているとデータストアにデータが溜まってく一方で消したくなる。


データストアの使用に開発用サーバーのデータを消す方法が書かれているものの

dev_appserver.py --clear_datastore helloworld/

自分のAptanaの環境ではdev_appserver.pyを使っていない。(実際はC:\Program Files\Google\google_appengineに入っている。)

仕方ないので

def deleteDB(self):
        g_list = DataStore.gql('order by element')
        for element in g_list:
                element.delete()

というメソッドを作っていちいち消さなきゃいけないのかなぁ。

Google App EngineでDjango1.2を動かす5

File "C:\Documents and Settings\Administrator\My Documents\Aptana Studio Workspace\Festival\src\django.zip\django\conf\__init__.py", line 38, in _setup
    raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

というエラーが出た。

とりあえずググってみると、こちらにエラーの回避方法を発見


場合はmodels.pyに

djangoのモデルをインポートする前に
from google.appengine.ext.webapp import template
をimportする必要があるとのこと。

つまりmodels.pyの冒頭に
from appengine_django.models import BaseModel

from google.appengine.ext.webapp import template
ではなく

from google.appengine.ext.webapp import template
from appengine_django.models import BaseModel



GAEでDjangoを動かす際の有用リンク集

Djangoの基本を勉強するなら

Python Webフレームワーク、第1回: DjangoとPythonを使ってWeb開発




もう少し進んで簡単なアプリケーションを作成する

Google App EngineでDjango1.2を動かす4

Aptana + Djangoでハマった際のメモ。

ローカルサーバーでテンプレートフォルダにテンプレートファイル(index.html)を入れて表示したい場合に、
settings.pyのTEMPLATE_DIRSにテンプレートフォルダをos.path.join(ROOT_PATH, "templates")で追加しているが、
ROOT_PATHはどこかというとos.path.dirname(__file__)
じゃあ実際にos.path.dirname(__file__)はどこかというと
"C:\Documents and Settings\Administrator\My Documents\Aptana Studio Workspace\Festival\src"

views.pyでテンプレートページの指定として
    return render_to_response('../templates/festa/index.html', {'g_list':g_list})
としているが、render_to_responseの第一引数が問題。

これを上記で指定したC:\Documents and Settings\Administrator\My Documents\Aptana Studio Workspace\Festival\src\templateだと思って、第一引数をfesta/index.htmlとするとそんなファイルがないと怒られる。

どうも、views.pyのファイル位置はC:\Documents and Settings\Administrator\My Documents\Aptana Studio Workspace\Festival\src\festaというパッケージの中なので、そりゃfesta/index.htmlは見つからない。よって相対パスとして'../templates/festa/index.html'とすれば正しく動く。

うーむ、TEMPLATE_DIRSが上手く反映されていないようだ。



なぞが解けたら追記しよう。

-----

Google Codeヘルプ"Google App Engine Helper for Django の使用"より

GAE上のDjangoの管理サイト

Django 管理サイトは SQL データベースのコンセプトと密接に関係しているため、Google App Engine ではサポートされていません。開発用 appserver により、代わりの管理インターフェースが、/_ah/admin(たとえば http://localhost:8080/_ah/admin)で自動的に提供されます。













2011年2月19日土曜日

Djangoのメモ

Djangoには「プロジェクト」と「アプリケーション」という概念があります。プロジェクトには複数のアプリケーションが存在できる、という関係です。どう使うかは人それぞれですが、私はユーザー向けのフロント側、管理側、APIというように、UIを切り口にしてアプリケーションを分離しています。PC用とモバイル用は、そもそもプロジェクトを分離してしまうことが多いです。もちろんベタープラクティスもありますが、このあたりは好みの問題でもあるので、いろいろトライしてみるとよいです。サービス単位でアプリケーションを分けることもあるでしょうし、まずはアプリケーションが1つのプロジェクトから始めればOKです。

 __init__.pyは、サイズが0バイトのPythonが認識する特殊なファイルです。ディレクトリ内にインポートする対象のパッケージがある場合に、中身が空でもよいので置いておくキマリがあります。
 manage.pyは、今後の開発で用いるユーティリティスクリプトです。中身はdjango-admin.pyと殆ど一緒で、manage.pyにコマンドを与えることでいろいろなことができます。
 settings.pyは、名前のとおり各種設定を記述するためのファイルです。django-admin.pyでプロジェクトを作成した直後は必要最小限の設定と説明文が書かれています。settings.pyは設定ファイルですが、Pythonスクリプトのファイルであり、Pythonとして書けることが実質何でも書けます。settings.pyに関数やクラス、メソッドも書けます。
 urls.pyはURLconfでURLとメソッドのマッピングをするためのファイルです。プロジェクトを作成した直後は、最小限の内容と説明文が記述されています。 プロジェクト作成後に最初にするのは、アプリケーションの作成かsettings.pyの編集です。ここではsettings.pyをいじることから始めましょう。

2011年1月4日火曜日

Google App EngineでDjango1.2を動かす3

[稼動環境] Aptana Studio 2.0.5  + Python 2.7.1+ Pydev 1.6.4+ Django 1.2.4 + Google App Engine Helper for Django 1.0.9

前回、前々回からのどハマリ続きのDjango 1.2.4 on GAE
Google App EngineでDjango1.2を動かす2
Google App EngineでDjango1.2を動かす1

引き続き動かないので、問題判別のために幾つか実験をば。

  • [Djangoのバージョン問題?] django.zipの中身を1.2.4から1.1.3に変更 -> 変わらず
  • [Eclipseの問題?] django.zipを消して、LocalのPCにインストールされているDjango1.2.4を使用、main.pyを通常のmain.pyに変更 -> "google.appengine.dist._library.UnacceptableVersionError"となる
  • [Eclipseの問題?] django.zipを消して、LocalのPCにインストールされているDjango1.2.4を1.1.3に変更、main.pyを通常のmain.pyに変更 -> 正常に稼動

以上の検証結果より、main.pyが悪さをしている様子。

もう一度main.pyを見直してみる。
もともとappengine_helper_for_django-r109.zipを展開したmain.pyは以下の通り



# Standard Python imports.
import os
import sys
import logging

from appengine_django import InstallAppengineHelperForDjango
InstallAppengineHelperForDjango()

from appengine_django import have_django_zip
from appengine_django import django_zip_path

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Import the part of Django that we use here.
import django.core.handlers.wsgi

def main():
  # Ensure the Django zipfile is in the path if required.
  if have_django_zip and django_zip_path not in sys.path:
    sys.path.insert(1, django_zip_path)

ここでInstallAppengineHelperForDjango()の行でインストールされているDjangoのバージョンをチェックして、1.2以上だとgoogle.appengine.dist._library.UnacceptableVersionErrorをはいていた。

そこでGoogleの"Zipimport を使って App Engine で Django 1.0 を使用する"を参照して作成したmain.pyが以下


# Standard Python imports.
import os
import sys
import logging

from appengine_django import InstallAppengineHelperForDjango
InstallAppengineHelperForDjango()

from appengine_django import have_django_zip
from appengine_django import django_zip_path

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Import the part of Django that we use here.
import django.core.handlers.wsgi


# Uninstall Django 0.96.
for k in [k for k in sys.modules if k.startswith('django')]:
    del sys.modules[k]

# Add Django 1.0 archive to the path.
django_path = 'django.zip'
sys.path.insert(0, django_path)
print sys.path

# Django imports and other code go here...
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'


def main():
  # Ensure the Django zipfile is in the path if required.
  if have_django_zip and django_zip_path not in sys.path:
      sys.path.insert(1, django_zip_path)

"# Uninstall Django 0.96."行から"def main()"までが追記したコード。

だけど、これをよくよく考えてみると"InstallAppengineHelperForDjango()"の後に、Django 0.96モジュールを抜いて、zipにしたDjango1.2.4をimportしている。

要は、せっかくモジュールのチェックをしたのにその後にモジュールを入れ替えているわけです。そりゃ意味ないわな。。。

ということでモジュール入れ替えを先にしたコードが以下。


# Standard Python imports.
import os
import sys
import logging

# Uninstall Django 0.96.
for k in [k for k in sys.modules if k.startswith('django')]:
    del sys.modules[k]

# Add Django 1.2.4 archive to the path.
django_path = 'django.zip'
sys.path.insert(0, django_path)

from appengine_django import InstallAppengineHelperForDjango
InstallAppengineHelperForDjango()

from appengine_django import have_django_zip
from appengine_django import django_zip_path

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Import the part of Django that we use here.
import django.core.handlers.wsgi

def main():
  # Ensure the Django zipfile is in the path if required.
  if have_django_zip and django_zip_path not in sys.path:
      sys.path.insert(1, django_zip_path)

これで正常に稼動した。

今回のどハマリの原因は
Eclipseの起動設定とGoogle App Engine Helper for DjangoのDjango受け入れバージョン問題, Django 1.2の使用, という3つの点が相まって問題を複雑にしていたわけですね。。。(--;

Google App EngineでDjango1.2を動かす2

[稼動環境] Aptana Studio 2.0.5  + Python 2.7.1+ Pydev 1.6.4+ Django 1.2.4 + Google App Engine Helper for Django 1.0.9

前回(google App EngineでDjango1.2を動かす1)の続き

エラーの中身を見るあたり"ImportError: No module named antlr3"とのことで、
要はantlr3のモジュールが見つからないということ。
antlr3モジュールはgoogle_appengine\libの下にあるが、どうもこのフォルダへのパスが通ってなかったのが原因ぽい。


ということで、プロジェクトを右クリックしてProperties -> PyDev - PYTHONPATH -> External Libraryに
${GOOGLE_APP_ENGINE}/lib/antlr3
${GOOGLE_APP_ENGINE}/lib/ipaddr
${GOOGLE_APP_ENGINE}/lib/fancy_urllib
を追加。
自分の環境では、${GOOGLE_APP_ENGINE}はC:\Program Files\Google\google_appengineを指す


さて改めて実行したが、またエラー。今度は
"ImportError: No module named admin.options"
これはdjango.zipファイルのdjango\contrib\admin\options.pyを指している様子。

GAEのドキュメント"Zipimport を使って App Engine で Django 1.0 を使用する"ではadminフォルダを消してもいいって書いてあるのに。。。
仕方ないのでDjangoフルパッケージを再度django.zipにしてプロジェクトのdjango.zipと置き換える。

気を取り直して再実行。けどまたエラー。
"google.appengine.tools.dev_appserver.AppConfigNotFoundError"です。
このエラーはapp.yamlファイルが見つからないのが原因のようです。
appengine_helper_for_django-r109.zipファイルをimportした際にsrcフォルダ下にちゃんとapp.yamlファイルがあるのに正しく認識されないのはどうしてだ?と思っていたら、
今度はEclipse側の設定の問題だったようです。

Run -> Run Configurationで、先ほど作成したPydev Google App Engineの起動設定のArgumentsのWorking directoryをDefaultの${project_loc}からOtherにチェックを入れて${project_loc}/srcに設定を変更。



これで再度実行。すると、consoleに色々とメッセージが出る。

"INFO:root:zipimporter('C:\\Documents and Settings\\Administrator\\My Documents\\Aptana Studio Workspace\\DjangoOnGAE\\src\\django.zip', 'django\\contrib\\')"
Djangoライブラリが読み込まれている


"WARNING:root:Could not read datastore data from c:\temp\django_djangoongae.datastore"
django_djangoongae.datastoreが見つからないと言われるが、そもそもファイルがないからそのまま放置

"WARNING:root:Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named _imaging"
これもnamed_imagingモジュールがないと言われているが解決策はGAEのサイトにある。とりあえず今は画像を使わないのでこれも放置


とはいえ
"INFO:root:Running application djangoongae on port 8001: http://localhost:8001"が表示されたので起動しているっぽいのでアクセス。

するとまだエラーが出る。

ChromeでアクセスするとResolver404エラー

 EclipseのConsoleにも"django\core\handlers\wsgi.py:222:  RuntimeWarning: Parent module 'django.core.handlers' not found while handling absolute import"などが表示されて、"INFO:root:"GET / HTTP/1.1" 500 -"が出ている。

むー。なかなか先は長いですね。


2011年1月3日月曜日

Google App EngineでDjango1.2を動かす1


Google App Engine上でDjangoを使用する場合、幾つかの制限がある。
それを補完するためにGoogle App Engine Helper for Djangoというツールが提供されている。
使用方法はこちらを参照。

ただ、このガイドではEclipseから利用する方法が書いていないので、今回はこの手順をまとめてみる。

使用するのは
[稼動環境] Aptana Studio 2.0.5  + Python 2.7.1+ Pydev 1.6.4+ Django 1.2.4 + Google App Engine Helper for Django 1.0.9

1. Aptana(Eclipse)を起動し、Pydev Package Explorerを右クリックしてNew->Projectを選択し、Pydev->Pydev Google App Engine Projectを選択


2. Project nameを適当につけて、Project typeをPython, Grammar Versionを2.7にしてNext>

3. Google App Engine Dictionaryのパスを指定。google_appengineフォルダを指定すると、自動で${GOOGLE_APP_ENGINE}, ${GOOGLE_APP_ENGINE}/lib/django, ${GOOGLE_APP_ENGINE}/lib/webob, ${GOOGLE_APP_ENGINE}/lib/yaml/libが追加される

4. application id registered for this projectをGAEに登録しているIDとし、templateはひとまずEmpty Projectとする

5. できたプロジェクトのsrcフォルダ内に、Google App Engine Helper for Djangozipファイルをimportする。

6. importするファイルタイプをArchive Fileを選択

7. ダウンロードしたzipファイルを選択
 8. プロジェクトにzipファイルの中身がimportされる。

9.appengine_helper_for_djangoパッケージは不要なので、それより下のappengine_djangoパッケージなどをsrcフォルダに移動して、appengine_helper_for_djangoフォルダを削除する

10. プロジェクトを選択肢、Run -> Run ConfigurationでPydev Google App Runをダブルクリック。Nameは適当に入力し、Projectを実行したいプロジェクトを選択、Main Moduleをimportしたmanage.pyを選択

 11. argumentsタブでprogram argumentsに"runserver"を入力して、Run

12.実行後コンソールには"google.appengine.dist._library.UnacceptableVersionError"が表示される

どうやらappengine_djangoパッケージにある__init__.pyのなかでDjangoのバージョンを1.0か1.1に限定しているようで、このままでは使用できないようだ。

次回(Google App EngineでDjango1.2を動かす2)へ続く。

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分くらい待っても変化なし。


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






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をもっと勉強しなければいけないけれども。






Amazon3