Python Pylons helpers の使用 |
helpersを使うサンプルが紹介されています。
http://wiki.pylonshq.com/pages/viewpage.action?pageId=11174255
以前作成した、メールアドレスをPOSTするmakoテンプレートを
helpersで書き換えると
${h.form(h.url(action='email'), method='post')}
Email Address(change): ${h.text_field('email')}
${h.submit('Submit')}
${h.end_form()}
※表示される画面は同じです。
あわせてファイルのアップロードを試してみます。
コントローラーに
・ファイルのアップロード画面
・アップロードされたファイルの処理
を行うメソッドを追加します。
#ファイル選択画面表示
def fileselect(self):
return render('/fileselect.mako')
#アップロード実行
def def upload(self):
myfile = request.POST['myfile']
permanent_file = open(os.path.join("C:\\upload\\",
myfile.filename.lstrip(os.sep)), 'w')
shutil.copyfileobj(myfile.file, permanent_file)
myfile.file.close()
permanent_file.close()
return 'Successfully uploaded: %s, description: %s' % \
(myfile.filename, request.POST['description'])
===================================================
[Warning]
アップロード先に指定されたファイルが存在する場合は、上書きされてしまいます。
また、ここで myfile.filename.lstrip(os.sep)と処理している意味ですが、
ファイル名がディレクトリの区切り文字(os.sep)で始まる場合、
os.path.join('/uploads/', '/uploaded_file.txt')
の結果は、
'/uploaded_file.txt'
となってしまいます。
これはルートディレクトリのファイル書き換えの可能性を示唆しており、
非常に危険です。
os.path.joinを使用する場合は、ファイル名の開始文字に注意しましょう。
===================================================
とのことです。なるほど。
しかし、このサンプルはWindowsでは動きませんでした。。。
というのも、myfile.filenameの内容はC:\dir\filename.ext
ですから、myfile.filename.lstrip(os.sep)としても、
文字列に変化はありません。
そこで私はこんな感じのソースに変更しました。
※抜粋です。
#importを追加
import shutil,os
##クラスメソッドを2つ追加
#ファイル選択画面表示
def fileselect(self):
return render('/fileselect.mako')
#ファイルアップロード処理
def upload(self):
#ここで得られるファイルはtempfileなのですぐに消えてしまう
myfile = request.POST['myfile']
#保存するファイル名を作成
outfile = os.path.join("c:\\upload\\", os.path.basename(myfile.filename))
#保存するファイルの実体を作成
permanent_file = open(outfile,'wb')
#コピー
shutil.copyfileobj(myfile.file, permanent_file)
#ファイルをクローズ
myfile.file.close()
permanent_file.close()
return 'Successfully uploaded: %s, description: %s' % \
(outfile, request.params['description'])
テンプレート
/templates/fileselect.mako
${h.form(h.url(action='upload'), multipart=True)}
Upload file: ${h.file_field('myfile')}
File description: ${h.text_field('description')}
${h.submit('Submit')}
${h.end_form()}
これで選択したファイルがC:\upload\(ファイル名)として
保存さるようになりました。
また、ヘルパークラスは
/lib/helpers.py
で
from webhelpers import *
と定義されている通り、実体はwebhelpersです。
http://pylonshq.com/WebHelpers/module-index.html
使いこなせば、楽にhtmlを生成することができそうですので、
改めて調べてみようと思います。
※しかし、exciteでopen(小文字)を含む記事を投稿
できないのは改善して欲しいですね・・・
今回のサンプルも全角に変換して登録していますので、
小文字に変更しないと動きません。