Hatena::Grouppython

nelnal@python

2010-10-29

[] Google App Engineチュートリアルでどはまり 22:45  Google App Engine のチュートリアルでどはまり - nelnal@python を含むブックマーク はてなブックマーク -  Google App Engine のチュートリアルでどはまり - nelnal@python

今度はGAEチュートリアルではまりました。

ちなみに前回に引き続き Ubuntu Linux 10.4 LTS & python2.5.5 です。

$ google_appengine/dev_appserver.py helloworld/

Traceback (most recent call last):

File "google_appengine/dev_appserver.py", line 69, in <module>

run_file(__file__, globals())

File "google_appengine/dev_appserver.py", line 65, in run_file

execfile(script_path, globals_)

File "/home/nelnal/workspace/gae_test/google_appengine/google/appengine/tools/dev_appserver_main.py", line 90, in <module>

from google.appengine.tools import appcfg

File "/home/nelnal/workspace/gae_test/google_appengine/google/appengine/tools/appcfg.py", line 63, in <module>

from google.appengine.tools import appengine_rpc

File "/home/nelnal/workspace/gae_test/google_appengine/google/appengine/tools/appengine_rpc.py", line 24, in <module>

import fancy_urllib

File "/home/nelnal/workspace/gae_test/google_appengine/lib/fancy_urllib/fancy_urllib/__init__.py", line 333, in <module>

class FancyHTTPSHandler(urllib2.HTTPSHandler):

AttributeError: 'module' object has no attribute 'HTTPSHandler'

$

色々調べてみるとSSLが含まれた python でないと urllib2 に HTTPSHandler が含まれない模様。

apt で libssl-dev をインストールし、再度コンパイルを実行しました。

$ cd Python-2.5.5

$ ./configure --prefix=$HOME

$ vi Module/Setup

sslで検索すると以下の4行が出てくるのでコメントアウトする。

#SSL=/usr/local/ssl

#_ssl _ssl.c \

# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \

# -L$(SSL)/lib -lssl -lcrypto

あとはインストールの実行

$ make -i altinstall

$ make altinstall


pyOpenSSL 導入手順 10:44 pyOpenSSL 導入手順 - nelnal@python を含むブックマーク はてなブックマーク - pyOpenSSL 導入手順 - nelnal@python

ついでに勘違いで pyOpenSSL の導入手順を覚えたのでメモ。

$ pip install pyOpenSSL

Downloading/unpacking pyOpenSSL

Running setup.py egg_info for package pyOpenSSL

warning: no previously-included files matching '*.pyc' found anywhere in distribution

Installing collected packages: pyOpenSSL

Running setup.py install for pyOpenSSL

building 'OpenSSL.crypto' extension

gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/nelnal/include/python2.5 -c src/crypto/crypto.c -o build/temp.linux-x86_64-2.5/src/crypto/crypto.o

In file included from src/crypto/crypto.h:17,

from src/crypto/crypto.c:14:

src/crypto/x509.h:17:25: error: openssl/ssl.h: No such file or directory

(中略)

error: command 'gcc' failed with exit status 1

----------------------------------------

Command /home/nelnal/bin/python2.5 -c "import setuptools;__file__='/home/nelnal/build/pyOpenSSL/setup.py';execfile(__file__)" install --single-version-externally-managed --record /tmp/pip-0jk8SG-record/install-record.txt failed with error code 1

Storing complete log in /home/nelnal/.pip/pip.log

$

といった感じでそのままインストールを行ってもエラーに・・・。

どうやら openssl/ssl.h が無いことが原因の様です。

aptitude search ssl から dev を含むパッケージを探してみると、libssl-dev がそれっぽいので、これをインストールして再度実行してみる

$ sudo apititude install libssl-dev

(略)

$ pip install pyOpenSSL

(略)

Successfully installed pyOpenSSL

Cleaning up...

OK!

一応、動作確認

$ python2.5

Python 2.5.5 (r255:77872, Oct 26 2010, 00:56:55)

[GCC 4.4.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import OpenSSL

>>>

OK!!!

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20101029

2010-10-28

[] bobo のチュートリアルではまる 23:54  bobo のチュートリアルではまる - nelnal@python を含むブックマーク はてなブックマーク -  bobo のチュートリアルではまる - nelnal@python

軽量 Web フレームワークのboboを使ってみてます。

bobo
http://pypi.python.org/pypi/bobo/

で、チュートリアルをしてたんですが

bobo.subrouteの処理がどうしても通らない。

http://bobo.digicool.com/index.html

>>> import bobo
>>> @bobo.subroute('/employees/:employee_id', scan=True)
... class Test:
  File "<stdin>", line 2
    class Test:
        ^
SyntaxError: invalid syntax
>>>

しかし、Windowsでは通る。・・・うーん。

そういうわけで色々と探してみたら、結局以下の様な結論だったと・・・。

http://docs.python.org/whatsnew/2.6.html#pep-3129-class-decorators

class decoratorは2.6以上からかー・・・。

というわけで、チュートリアルの subroute の処理は通らないという結論でした。

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20101028

2010-10-26

[] ローカルに virtualenv, virtualenvwrapper を導入する方法。 23:48  ローカルに virtualenv, virtualenvwrapper を導入する方法。 - nelnal@python を含むブックマーク はてなブックマーク -  ローカルに virtualenv, virtualenvwrapper を導入する方法。 - nelnal@python

ImportError: No module named virtualenvwrapper.hook_loader

のエラーが出てはまったのでメモ。


まずは、virtualenv, virtualenvwrapper をインストールする

$ easy_install virtualenv

$ easy_install virtualenvwrapper

つぎに .bashrc の設定を追加する

$ vim .bashrc

.bashrc への追記内容は以下の通り

export PYTHONPATH=(dir)/lib/python-2.5/site-packages/

export VIRTUALENVWRAPPER_PYTHON=(dir)/bin/python2.5/

export WORKON_HOME=$HOME/.virtualenvs

source $HOME/bin/virtualenvwrapper.sh

保存をしたら、.virtualenvs ディレクトリを作成し、.bashrc を読み込む。

$ mkdir ~/.virtualenvs

$ . ~/.bashrc

あとは virtualenv を実行するだけ

$ workon

$ mkvirtualenv testenv




python 2.5.5 install メモ 18:18 python 2.5.5 install メモ - nelnal@python を含むブックマーク はてなブックマーク - python 2.5.5 install メモ - nelnal@python

Ubuntu 10.4 LTS に python 2.5.5 を導入するときにコンパイルエラーで手間取ったのでメモ。

ちなみにインストール先はホームディレクトリです。

$ cd $HOME

$ sudo aptitude install zlib1g-lib

$ wget http://www.python.org/ftp/2.5.5/Python-2.5.5.tgz

(省略)

$ tar zxvf Python-2.5.5

(省略)

$ cd Python-2.5.5

$ ./configure --prefix=$HOME

(省略)

$ sudo make install

(省略)

After a lot of output, got this:

Listing /usr/local/lib/python2.5/xml/sax ...

Compiling /usr/local/lib/python2.5/xml/sax/__init__.py ...

Compiling /usr/local/lib/python2.5/xml/sax/_exceptions.py ...

Compiling /usr/local/lib/python2.5/xml/sax/expatreader.py ...

Compiling /usr/local/lib/python2.5/xml/sax/handler.py ...

Compiling /usr/local/lib/python2.5/xml/sax/saxutils.py ...

Compiling /usr/local/lib/python2.5/xml/sax/xmlreader.py ...

Compiling /usr/local/lib/python2.5/xmllib.py ...

Compiling /usr/local/lib/python2.5/xmlrpclib.py ...

Compiling /usr/local/lib/python2.5/zipfile.py ...

make: *** [libinstall] Error 1

$

となりエラーとなってしまう。

色々と調べたところ、以下のページに解決方法があったので、それで対応した。

http://markmail.org/message/n7oim5smzd5j3nft#query:python%20bug%231669349+page:1+mid:rf23z7wlhogponlr+state:results

$ sudo vim Modules/Setup

451 行目に

「#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz」

と書かれているのでコメントを解除する。

その後、

$ sudo make -i altinstall

$ sudo make altinstall

インストールが完了する。

[] Enum クラス 18:10  Enum クラス - nelnal@python を含むブックマーク はてなブックマーク -  Enum クラス - nelnal@python

自分流のEnumクラスを作ったので書いておく(作ったのはずいぶん前だけど)。

# -*- coding: utf-8 -*-
class EnumType(object):
    class ConstructionError(Exception): pass
    class SetNewAttributeError(Exception): pass

    MSG_KEY_ERROR = u'列挙のキーが文字列型ではありません。'
    MSG_NOT_DEFINED_KEY_IN_DICT = u'辞書に未定義のキーがあります。'
    MSG_INDEX_ERROR = u'インデックス値が数値ではありません。'

    def __init__(self, *args, **kwargs):
        """ __init__(self, *args, **kwargs):
        コンストラクタ
        
        <Example>
        EnumType('a', 'b', 'c', 'd', c=4, d=8)
            ->  a = 0, b = 1, c = 4, d = 8

        EnumType(x=10, y=10, z=30)
            -> x = 10, y = 10, z = 30
        """
        if args:
            # キー情報が可変長引数で渡されている場合
            if kwargs:
                # kwargs のキー値がの全てが args で定義されていなければならない
                if not (set(kwargs.keys()) <= set(args)):
                    raise self.ConstructionError(self.MSG_NOT_DEFINED_KEY_IN_DICT)
            if not all(map(lambda x: isinstance(x, basestring), args)):
                raise self.ConstructionError(self.MSG_KEY_ERROR)

            index = 0
            for v in args:
                index = kwargs.setdefault(v, index)
                self.__setattr__(v, index)
                index += 1
        elif kwargs: # len(args) == 0, len(kwargs) != 0 の場合
            if not all(map(lambda x: isinstance(x, basestring), kwargs.keys())):
                raise self.ConstructionError(self.MSG_KEY_ERROR)
            if not all(map(lambda x: isinstance(x, int), kwargs.values())):
                raise self.ConstructionError(self.MSG_INDEX_ERROR)

            for key in kwargs.keys():
                self.__setattr__(key, kwargs[key])
        else:
            pass

    @property
    def keywords(self):
        return self.__dict__.keys()

    @property
    def max_value(self):
        """ max_value 列挙の最大値を取得 """
        return max(self.__dict__.values())

    @property
    def min_value(self):
        """ min_value 列挙の最小値を取得 """
        return min(self.__dict__.values())

    def _getMaxValue(self):
        return self.max_value

    def _getMinValue(self):
        return self.min_value

    def __setattr__(self, name, value):
        # dict.setdefault を行うと
        # name が登録済みの場合は、登録済みの dict[name] の値を
        # name が未登録の場合は、dict[name] に value が設定される
        # このことを利用して登録済みの項目の値を変更出来ない様にしている
        self.__dict__.setdefault(name, value)
        if self.__dict__[name] != value:
            raise self.SetNewAttributeError(name, value)

    def __str__(self):
        return self.__repr__()

    def __repr__(self):
        aliases = dict()
        for key in self.__dict__.keys():
            if isinstance(self.__dict__[key], int) and not key.startswith('_'):
                aliases.setdefault(self.__dict__[key],list()).append(key)

        values = list()
        for key in aliases.keys():
            values.append("%s:%s" % (key, aliases[key]))
        return ', '.join(values)

if __name__ == "__main__":
    animals = EnumType('cat', 'dog', 'bird', 'mouse', 'fox', dog=3, mouse=7)

    print animals

    try:
        animals.bird = 10
    except EnumType.SetNewAttributeError:
        print "Animals.bird = 10 -> raise 'EnumType.SetNewAttributeError'"

    print animals.min_value, animals.max_value

    print animals.keywords

    animals = EnumType(apple=1, grape=3)


トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20101026

2010-10-07

[] Testフォルダを作成し、そのフォルダの中からテストをする為に必要な処理 11:05  Testフォルダを作成し、そのフォルダの中からテストをする為に必要な処理 - nelnal@python を含むブックマーク はてなブックマーク -  Testフォルダを作成し、そのフォルダの中からテストをする為に必要な処理 - nelnal@python

要するに1つ上位のディレクトリモジュールが読めれば良いので sys.path に1つ上のパスを足すだけ。

以下のコードを各テストファイルの一番上に書けば良い

import os.path

curdir = os.path.abspath(os.path.curdir)
postions = curdir.split(os.path.sep)
parent_dir = os.path.sep.join(postions[:-1])
#print parent_dir

import sys

sys.path.append(parent_dir)
#print sys.path
トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20101007

2010-09-11

[][] Office XP を Iron PythonC# から使えるようにする方法 22:31  Office XP を Iron Python や C# から使えるようにする方法 - nelnal@python を含むブックマーク はてなブックマーク -  Office XP を Iron Python や C# から使えるようにする方法 - nelnal@python

結構迷ったので簡単ながらメモ。


1. .NET Framework 2.0 をインストールする

Microsoft .NET Framework Version 2.0 再頒布可能パッケージ (x86)

必要に応じてアップデートもしておくこと。

ちなみに入れたかどうか忘れてしまった場合は、

以下の方法でインストール状況を調べる

.NET Frameworkのバージョンを確認する方法



2. .NET Framework 2.0 SDKインストールする

Microsoft .NET Framework 2.0 SDK 日本語版 (x86)


3. Office XP 用のPIA(Primary Interop Assembly)をインストールする

Primary Interop Assembly というソフトで COM と .NET 環境の橋渡しをするらしい。

Office XP PIAs

ダウンロードしたらこれを実行する。実行するとファイルの展開先を訊かれるので、適当な箇所に展開する。

ここでは「C:\temp」としておく。


4. コマンドプロンプトを起動する

5. gacutil.exe のあるパスへの環境変数を設定する。

環境変数 PATH に gacutil.exe へのパスを追加する。

gacutil.exe は .NET Framework 2.0 SDK が問題なくインストールできていれば「C:\Program Files\Microsoft.NET\SDK\v2.0\Bin」に存在するので、そのパスを追加してやる。

> set PATH=%PATH%;C:\Program Files\Microsoft.NET\SDK\v2.0\Bin

PATHが正しく設定出来ているか一応確認

> echo %PATH%

または gacutil.exe コマンドを打って確かめても良い



6. PIAの登録を行う

gacutil.exe へのパスが通ったのを確認したら、PIAファイルを展開したパスに移動する。

移動後、PIAファイル群に含まれている register.bat を打てばPIAの登録作業(Assemblyとレジストリへの登録)が始まる。

> cd C:\temp
C:\temp> register.bat

登録が上手くいっていれば、以下の様なメッセージが出る

C:\temp> register.bat

C:\temp>echo off
Microsoft Office XP Primary Interop Assemblies Registration Utility
Copyright (c) 2002 Microsoft(R) Corporation. All rights reserved.
Note: This utility must be run from the Visual Studio .NET Command Prompt. It wi
ll not function properly otherwise.
Start adding primary interop assemblies to the global assembly cache.

C:\temp>gacutil -i Microsoft.Office.Interop.Access.dll
Microsoft (R) .NET Global Assembly Cache Utility.  Version 2.0.50727.42
Copyright (c) Microsoft Corporation.  All rights reserved.

アセンブリが正しくキャッシュに追加されました

7. ログアウトまたは再起動

レジストリへの登録が行われたので、ログアウトまたは再起動をおこなう。


これで作業は完了です。



IronPython で動作確認

IronPython Console を起動して以下の様に記載する

>>> import clr
>>> clr.AddReference("Microsoft.Office.interop.Excel")

ここまで入力してエラーが出なければ問題なくインストール出来ている。


IronPython での Excel マクロの実行方法などは他のページを当たってください。

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20100911

2009-10-19

フッタを付与するプログラム 15:04  フッタを付与するプログラム - nelnal@python を含むブックマーク はてなブックマーク -  フッタを付与するプログラム - nelnal@python

以下を参考にしながら書いた。

http://d.hatena.ne.jp/rintaromasuda/20060722/1153552896

# -*- coding: utf-8 -*-

import sys
import os
import glob
import functools

def add_suffix(filename, suffix):
    root, ext = os.path.splitext(filename)
    return root + suffix + ext

if __name__ == "__main__":
    from optparse import OptionParser
    parser = OptionParser(usage="usage: %prog [options] message")

    parser.add_option("-s", "--suffix", dest="suffix", default="_bk")

    options, args = parser.parse_args()
    print options, args

    if len(args) == 0:
        src_names = [item for item in os.listdir(os.curdir) if os.path.isfile(item)]
        # 実行ファイルは除外
        if __file__ in src_names:
            del src_names[src_names.index(os.path.basename(__file__))]
    else:
        src_names = [item for arg in args for item in glob.glob(arg)]

    conv_name = functools.partial(add_suffix, suffix=options.suffix)
    dest_names = map(conv_name, src_names)

    map(os.rename, src_names, dest_names)

スクリプト自身を表す変数 13:53  スクリプト自身を表す変数 - nelnal@python を含むブックマーク はてなブックマーク -  スクリプト自身を表す変数 - nelnal@python

良く忘れすのでメモ。

print __file__

# その2
import sys
print sys.argv[0]

__file__ の方が手っ取り早いと思う。

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20091019

2009-09-25

[] pywin32 の rev.214 にバグがあってハマった件 16:02  pywin32 の rev.214 にバグがあってハマった件 - nelnal@python を含むブックマーク はてなブックマーク -  pywin32 の rev.214 にバグがあってハマった件 - nelnal@python

OLE関連でハマったのでメモ。


問題点1

makepy.py で使用したOLEファイルがPythonバージョンアップによる変更を受けて使えなくなっている。


問題が発生する条件
  • アプリOLEファイルを生成している場合(つまりmakepy.pyを使用してファイルを作成した場合 → 参考
    • OLEファイルの生成を行った時のPythonのバージョンが「2.5以前」
    • 上記生成ファイルを読み込んで使用している。
  • Python のバージョンを「2.6」以上に乗り換えた場合。

特に py2exe での仕様を前提としてOLEファイル(モジュール)を何らかの形で読み込んでいる場合。


解決方法

素直にOLEファイルを再生成すれば良い。



・・・が、以下の問題が発生。


問題点2

makepy.py を使用してファイルを生成する時にエラーになる。

エラー内容

C:\>Python26\Lib\site-packages\win32com\client>python makepy.py -o ole_test.py
Building definitions from type library...
Traceback (most recent call last):
    ...
AssertionError: <open file 'ole_test.py', mode 'w' at 0xXXXXXXXX>

前提条件
  • 使用している pywin32 のバージョンが 214*1

解決策

makepy.py の記載を変更する。


変更前(367行目から)

    if outputName is not None:
        path = os.path.dirname(outputName)
        if path is not '' and not os.path.exists(path):
            os.makedirs(path)
        f = open(outputName, "w")
    else:
        f = None

変更後

371行目をコメントアウトして2行追加する

    if outputName is not None:
        path = os.path.dirname(outputName)
        if path is not '' and not os.path.exists(path):
            os.makedirs(path)
        #f = open(outputName, "w")
        import codecs
        f = codecs.open(outputName, mode="w", encoding="mbcs")
    else:
        f = None

詳細はこちら(ML:patch to makepy.py / genpy.py)に記載がある。

*1:問題としてはrev. 213が原因になっている模様

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090925

2009-08-25

[] 「Django Book」をやってみる:Chapter 4 Templates その2 23:11  「Django Book」をやってみる:Chapter 4 Templates その2 - nelnal@python を含むブックマーク はてなブックマーク -  「Django Book」をやってみる:Chapter 4 Templates その2 - nelnal@python

複雑なデータを使用する。

ここでは今までの様な単純なデータを使用してましたが、より複雑なデータをContextクラスに取り込んだ場合でも簡単な記述で使用出来る様に変換する仕組みを備えています。


例えば辞書型の場合

>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
u'Sally is 43 years old.'

また、オブジェクトの属性(Attribute)も上手く取り扱うことが出来ます。

>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template('The manth is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
u'The manth is 5 and the year is 1993.'

当然自分で作成したクラスにも対応出来ます。

>>> from django.template import Template, Context
>>> class Person(object):
...     def __init__(self, first_name, last_name):
...             self.first_name, self.last_name = first_name, last_name
... 
>>> t = Template('Hello, {{ person.first_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
u'Hello, John.'

さらにオブジェクトのメソッドについても使用可能です。

丸括弧を付ける必要はありません。

>>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
u'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
u'123 -- 123 -- True'

最後に配列の要素へのアクセス方法についても記載します。

>>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
u'Item 2 is carrots.'


メソッド呼び出し時の振る舞い(例外の処理について)

メソッドの呼び出しについては他の属性の呼び出しと似ている部分が多いですが、

メソッドの処理に失敗した場合の振る舞いが違ってきます。


メッソドの実行中に例外が発生した場合は通常のPythonプログラムと同様に処理を中断して例外の発生をメッセージとして表示します。

しかし、raiseする例外クラスの属性「silent_variable_failure = True」を追加した場合は、例外の発生を無視して空のデータを返して実行を継続することが出来る。

>>> t = Template("My name is {{ person.first_name }}.")
>>> class PersonClass3:
...     def first_name(self):
...             raise AssertionError, "foo"
...
>>> p = PersonClass3()
>>> t.render(Context({"person": p}))
Traceback (most recent call last):
   ...
AssertionError: foo
>>> # 例外の発生を無視する
>>> class SilentAssertionError(AssertionError):
...     silent_variable_failure = True
...
>>> class PersonClass4:
...     def first_name(self):
...             raise SilentAssertionError
... 
>>> p = PersonClass4()
>>> t.render(Context({"person": p}))
u'My name is .'

また、ここであるオブジェクト(ここでは BankAccount とする)が delete メソッドを持っているとします。

もしテンプレートが {{ account.delete }} を含んでいた場合*1にテンプレートを展開しようとするとオブジェクトが削除されてしまうことになってしまいます。

もしこれを防ごうとする場合、delete メソッドに alters_data という属性を付与し、値を True にすることによって対処します。

def delete(self):
    # Delete the account
    ...
delete.alters_data = True

これによってテンプレートを展開する際にメソッドを実行出来なくなります。

上記の例で言うと {{ account.delete }} を展開する際に delete メソッドは実行されず、また警告も出ずに失敗することになります。



Next --> Chapter 4 その3

*1:account は BankAccount のインスタンス

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090825

2009-08-19

[] 「Django Book」をやってみる:Chapter 4 Templates 22:55  「Django Book」をやってみる:Chapter 4 Templates - nelnal@python を含むブックマーク はてなブックマーク -  「Django Book」をやってみる:Chapter 4 Templates - nelnal@python

テンプレートのサンプル

<html>
<head><title>Ordering notice</title></head>

<body>

<h1>Ordering notice</h1>

<p>Dear {{ person_name }},</p>

<p>Thanks for placing an order from {{ company }}. It's scheduled to 
ship on {{ ship_date|date:"F j, Y" }}.</p>

<p>Here are the items you've orderd:</p>

<ul>
{% for item in item_list %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

{% if ordered_warranty %}
    <p>Your warranty infomation will be included in the packaging.</p>
{% else %}
    <p>You didn't order a warranty, so you're on your own when 
    the products inevitably step working.</p>
{% endif %}

<p>Sincerely,<br />{{ company }}</p>

</body>
</html>

解説

上記文書の内、中括弧({,})で囲まれた部分は変数となります。

{{ person_name }}


{% for item in item_list %}

...

{% endfor %}


{% if ordered_warranty %}

...

{% else %}

...

{% endif %}

中括弧の中に記載された名前がキーワードとして使用されることになります。


{%」と「%}」に囲まれた部分は値によって処理の切り替えの為のテンプレート記法です。

{% if ordered_warranty %}


forはsequenceタイプのデータを渡して格納されている要素を個別に文書に反映する為に使用します。

ifは変数として渡したデータが有効かどうか(True判定になるか)で表示(またはその他の処理の記述)を切り替える為に使用します。


また、変わった使用方法として第2段落のテンプレート記法があります。

{{ ship_date|date:"F j, Y" }}

これは日付データ*1の表示形式を変更する記法です。


テンプレートシステムを試してみる。

ここではシェルを使ってテンプレート記法とその変換処理を試してみます。

シェルで

$ python manage.py shell

と打ってシェルを実行します。

この様にシェルを呼び出さないと django モジュールを呼び出すことが出来ません。


それではテンプレートのテストをしてみます。

>>> from django import template
>>> t = template.Template('My name is {{ name }}.')
>>> c = template.Context({'name': 'Adrian'})
>>> print t.render(c)
My name is Adrian
>>> c = template.Context({'name': 'Fred'})
>>> print t.render(c)
My name is Fred.


Next --> Chapter4 その2

*1:datetimeモジュール使用

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090819

2009-08-06

[] 実行するプログラムがあるディレクトリ絶対パスで取得する 15:52  実行するプログラムがあるディレクトリを絶対パスで取得する - nelnal@python を含むブックマーク はてなブックマーク -  実行するプログラムがあるディレクトリを絶対パスで取得する - nelnal@python

良く忘れるのでメモ

import os.path

print os.path.dirname(os.path.abspath(__file__))
トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20090806