Python Pylons helpers の使用



テンプレートエンジンmakoへの記載に
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(小文字)を含む記事を投稿
できないのは改善して欲しいですね・・・
今回のサンプルも全角に変換して登録していますので、
小文字に変更しないと動きません。




もどる