genshiでCDATA書いたら消えた

Python No Comments »

テンプレートファイルにCDATA書いたのに吐き出されたHTMLファイルでは消えてた。
index.tmpl

 
    <script type="text/javascript">
    < ![CDATA[
      swfobject.registerObject("swfobj", "9.0.0", "menu.swf");
    ]]>
    </script>
 


index.html

 
    <script type="text/javascript">
 
      swfobject.registerObject("swfobj", "9.0.0", "menu.swf");
 
    </script>
 

追記(2008/10/17 14:04)--
render("html")と書いてたのを
render("xhtml")にしたら消えなかった。
に変換されてたのも解消された。

Djangoのテンプレートでつまづき中

Python No Comments »

Djangoのテンプレートでfor文中で3回に1度だけ文字列を出力したい。

 
{% for item in items %}
  {{ item.name }},
  {# 3つ出力して改行入れたい #}
{% endfor %}
 
 
{% for item in items %}
  {{ item.name }},
  {% ifequal forloop.counter%3 0 %}{% endifequal %}
{% endfor %}
 

こんなんじゃダメなのかな。動いてない気がする。@GAE。
↑preタグ内の<br />が消えてる。。

Pythonことはじめ #8

Python No Comments »

Instant Hacking
練習2の"ユークリッドの互除法によって2個の数の最大公約数を求める関数を書きなさい。"をやってみた。

#!C:\Python25\python.exe
 
def hcd(a,b):
    if(a&lt;b):
        a, b = b, a
 
    while b != 0:
        a, b = b, a % b
 
    return a
 
print hcd(20,12)

解答例はこう↓だった。"aはbより大きいものとする。"そうか。ifあたり不要だった。whileの条件には"!=0"とか要らなかったか。0はFALSEってことなんだっけ。

def euclid(a,b):
    while b:
        a,b = b,a % b
    return a

Jython

Python No Comments »

Jython は Python、Java の初心者が触れてもいいものだろうか。
まったく理解できる気がしないな。出直す。ひとまずPythonの勉強をする。
Jythonプログラミングとか買うとしたら数年後。

Pythonことはじめ #7

Python No Comments »

DBをアップデートする。

入力画面text.htmlのソース:

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"&gt;
  &lt;head&gt;
    &lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8" /&gt;
    &lt;title/&gt;Form&lt;/title&gt;
  &lt;/head/&gt;
  &lt;body/&gt;
    &lt;form action="./form.py" method="post"&gt;
      &lt;p&gt;
        &lt;input type="text" value="" name="text" /&gt;
        &lt;input type="submit" value="submit" /&gt;
      &lt;/p&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;

submitした後の画面form.pyのソース:

#!C:\Python25\python.exe
# -*- coding: utf-8 -*-
 
import cgi
import MySQLdb
 
form_data = cgi.FieldStorage()
text = form_data.getfirst("text")
 
con = MySQLdb.connect(db="test", host="localhost", port=3306, user="testuser", passwd="********")
cur = con.cursor()
cur.execute('update pytest set body="%s" where title="%s"' % (text,"test"))
cur.close()
con.close()
 
html_head = '''&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8" /&gt;
&lt;title&gt;Pythonことはじめ&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;'''
 
html_foot = '''&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;'''
 
print "Content-Type: text/html\n\n"
print html_head
print text
print "と書き込みました"
print html_foot

dddと書いてsubmitしたら、dddと書き込みましたと表示された。
pytestのtitleがtestのレコードはbodyがdddに変更された。OK。

Pythonことはじめ #6

Python No Comments »

DBに格納されたデータを参照してみる。

testというDBにpytestというテーブルを作成して、
|title|body|
|test|aaa|
というデータを格納。

index.py:

#!C:\Python25\python.exe
# -*- coding: utf-8 -*-
 
import MySQLdb
con = MySQLdb.connect(db="test", host="localhost", port=3306, user="testuser", passwd="********")
cur = con.cursor()
 
s = "SELECT title, body FROM pytest"
cur.execute(s)
r = cur.fetchone()
 
print "Content-type:text/htmlnn"
print "&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"&gt;"
print "&lt;html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" lang=\"ja\"&gt;"
print "&lt;head&gt;"
print "&lt;meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" /&gt;"
print "&lt;title&gt;Pythonことはじめ&lt;/title&gt;"
print "&lt;/head&gt;"
print "&lt;body&gt;"
print "&lt;p&gt;"
 
while r != None:
  print "%-10s | %-40s" % r
  r = cur.fetchone()
 
print "&lt;/p&gt;"
print "&lt;/body&gt;"
print "&lt;/html&gt;"
 
cur.close()
con.close()

ブラウザから確認すると、test|aaa と表示された。○。

Pythonことはじめ #5

Python No Comments »

ファイルを読み込んで表示。

Python でファイルを読む
を参考に。

f = open('text.txt', 'r')

for line in f:
    print line,

f.close()

サンプルコードそのまま。

text.txt:

watashi wa dododo

watashi wa dododo
と表示された。OK。

続いて、タブ区切りのファイルを。

text.txt:

watashi	wa	dododo
anata	wa	gogogo
for line in open('text.txt', 'r'):
    name, zip, address = line[:-1].split('t')
    print name
    print "<br />"
    print zip
    print "<br />"
    print address
    print "<br />"
    print "<br />"

全然、名前/郵便番号/住所 じゃありませんが。。

watashi
wa
dododo

anata
wa
gogogo

と表示されたOK。
line[:-1] は、lineの最後に入っている改行コード '\n' を取り除きます。
とのこと。Perlのchompと同等かな。

Pythonことはじめ #4

Python No Comments »

なにかテンプレートエンジンをいじってみたくなったので探してみたらGenshiってのがちょっと気になったので触ってみる。

参考:

ブラウザで
http://ftp.edgewall.com/pub/genshi/Genshi-0.4.2.tar.gz
にアクセスしてDL。
解凍。
Genshi-0.4.2というフォルダができる。
その中のgenshiフォルダをgenshi-test.pyと同じ階層に置く。

genshi-test.py:

#!C:\Python25\python.exe
# -*- coding: utf8 -*-

def main():
    print "Content-Type:text/html\n\n",
    import cgi
    from genshi.template import TemplateLoader
    from genshi.template import MarkupTemplate
    import os
    TEMPLATE_DIR = "./"
    loader = TemplateLoader(TEMPLATE_DIR)
    tmpl = loader.load('genshi-tmpl.html')
    myList = [u'焼肉',u'寿司',u'手羽先']
    stream = tmpl.generate(myH1 = u"好きな食べ物", myList = myList)
    html = stream.render("html")
    print html
if __name__=='__main__':
    main()

genshi-test.pyと同じ階層にテンプレートファイルgenshi-tmpl.htmlを置く。
genshi-tmpl.html:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://genshi.edgewall.org/" lang="ja">
  <head>
    <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=UTF-8" />
    <title>genshi</title>
  </head>
  <body>
    <h1 py:content="myH1">hogefuga</h1>
    <ol>
      <li py:for="item in myList">${item}</li>
    </ol>
  </body>
</html>

ブラウザからgenshi-test.pyにアクセスすると

好きな食べ物

1. 焼肉
2. 寿司
3. 手羽先

と表示。おk。

Pythonことはじめ #3

Python No Comments »

関数を書いてみる

#!C:\Python25\python.exe
# -*- coding: utf-8 -*-

def Say(x):
    return x * 2

print "Content-type:text/html\n\n"
print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
print "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" lang=\"ja\">"
print "<head>"
print "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />"
print "<title>Pythonことはじめ</title>"
print "</head>"
print "<body>"
print "<p>"

print Say("ho!")
print Say("こんにちは")

print "</p>"
print "</body>"
print "</html>"

ho!ho! こんにちはこんにちは
と表示された。おk。

繰り返しの回数を指定できるようにする

パラメータを2つ渡すように変更。

def Say(x,y):
    return x * y

として

print Say("ho!",2)
print Say("こんにちは",3)

ho!ho! こんにちはこんにちはこんにちは
と表示された。

2つ目のパラメータとして文字列を渡してみる

こんにちは * fugaa とか、数字じゃないものを掛けるとどうなるかな。

print Say("ho!",2)
print Say("こんにちは","fuga")

としてみたら

ho!ho!
だけが表示された。

関数を使って変数をいじってみる

def Say(x,y):
    return x * y

def Say(x,y):
    word = x * y
    return word

と変えてみた。表示されるものに特に変化なし。

word = ""

def Say(x,y):
    word = x * y

として

Say("hello",2)
print word

でhellohelloと表示されるのを期待したけど

None
と表示される

word = ""

def Say(x,y):
    global word
    word = x * y

とすることでhellohelloが表示されるようになった。
グローバル変数ってやつですね。グローバル変数はあんまり使わない方がいいよ、ですかね。

Pythonことはじめ #2

Python No Comments »

importしてみる

import 使ってみた。

#!C:\Python25\python.exe
# -*- coding: utf-8 -*-
print "Content-type:text-html\n\n"
import Hello

Hello.py を同じ階層に作成。(内容は下記)

print "KonNichiHa!"

ブラウザから確認。おk。

importするファイルがない時、以降の処理は行われない

#!C:\Python25\python.exe
# -*- coding: utf-8 -*-
print "Content-type:text-html\n\n"
print "dododo\n"
import Hello
print "yoyoyo\n"

と変更して

Hello.py を同じ階層から別の場所へ移動。
それでも普通に見える。Hello.pycを同じ階層から別の場所へ移動。

dododoだけが表示されてる。
importするファイルがない場合、以降の処理が行われないらしい。

importされるファイルに日本語が含まれる場合

Hello.py を元の階層に戻して

print "こんにちは"

と変更。

dododoだけが表示されてる。
Hello.pyにも

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

を足してあげる必要があるかな。

Hello.py

# -*- coding: utf-8 -*-
print "こんにちは"

dododo こんにちは yoyoyo と表示された。よかった。
importされるファイルの方で日本語を使うときはそのファイルでエンコードの指定が必要なのかな。

ただ、下記のように前後のdododo/yoyoyoを消すと文字化けた。

#!C:\Python25\python.exe
# -*- coding: utf-8 -*-
print "Content-type:text-html\n\n"
import Hello

ブラウザが文字コード判定を間違えてるのかしら。
Fxの場合:表示>文字エンコーディング>Unicode (UTF-8)
すると"こんにちは"がちゃんと表示される。ふーむ。。

Powered by WordPress | WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン