Python: March 2009 Archives

HDEラボの桜井です。
今日は東京暖かいです。仕事してる場合ではありませんw

前回のエントリーにツッコミいただいたので、その方法を試したところ解決しました。
pythonのprint関数の仕様がよくわからなかったので。

念のため、解決方法。ダウンロード時に対処します。
    import sys

    print "Content-Type: application/zip;\r\nContent-Disposition: attachment; filename=test.zip\r\n\r\n",
    f = open("/tmp/test.zip")
    sys.stdout.write(f.read())
    f.close()

ふーん、なるほど。
HDEラボの桜井です。
3月寒いっす。

なんとなく、困ったことがあります。
pythonでzipファイルをWebブラウザ経由でダウンロードさせるプログラムを作り、
さらにそのダウンロードじたzipファイルを再びアップロードするプログラムを作ったところ、
なんと、アップロード時に正しいzipファイルと認識されなかったのである。

問題のプログラムを見てみよう。
test.cgi
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import zipfile, cgi, os, shutil
import web.template

form = cgi.FieldStorage()
command = form.getfirst('command', '')

message = ""
error = 0

if command == "backup":

    zip = zipfile.ZipFile("/tmp/test.zip", 'w', zipfile.ZIP_DEFLATED)
    zip.write("/tmp/file1", "file1")
    zip.close()

    print "Content-Type: application/zip;\r\nContent-Disposition: attachment; filename=test.zip\r\n\r\n",
    f = open("/tmp/test.zip")
    print f.read(),
    f.close()

    os.unlink("/tmp/test.zip")

else:

    if command == "restore":

        if form.has_key('zip'):
            item = form['zip']
            if item.file:
                try:
                    tmpFileObj = file("/tmp/test2.zip", 'wb')
                    shutil.copyfileobj(item.file, tmpFileObj)
                    tmpFileObj.close()
                    os.chmod("/tmp/test2.zip", 0777)
                except Exception, ex:
                    error = 1
                    message = "ファイルのアップロードに失敗しました"
            else:
                error = 1
                message = "ファイルが選択されていません"
        else:
            error = 1
            message = "ファイルが選択されていません"

        if error == 0 and zipfile.is_zipfile("/tmp/test2.zip"):
            zip = zipfile.ZipFile("/tmp/test2.zip")
            for name in zip.namelist():
                f = open("/tmp/" + name, 'w')
                f.write(zip.read(name))
                f.close()
            zip.close()
                os.unlink(tmpPath + file)

            message = "復元しました"

        else:
            error = 1
            message = "復元できませんでした"

        os.unlink("/tmp/test2.zip")

    values = { "command" : command,
               "message" : message,
               "error"   : error
             }

    render = web.template.render("./template")
    print 'Content-Type: text/html; charset=utf-8'
    print ''
    print render.test(values)


それから、テンプレートファイル(テンプレートの詳細はこちら
./template/test.html
$def with (values)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" id="sixapart-standard">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>zipダウンロードとアップロード</title>
</head>
<body>

<h2>zipダウンロード</h2>

$if values["command"] == "backup":
  $if values["error"] == 1:
    <h3><font color="red">$values["message"]</font></h3>
  $else:
    <h3>$values["message"]</h3>

<form action="backup.cgi" method="POST">
<input type="hidden" name="command" value="backup">
<input type="submit" value="設定ファイルをバックアップする">
</form>

<hr>

<h2>zipアップロード</h2>

$if values["command"] == "restore":
  $if values["error"] == 1:
    <h3><font color="red">$values["message"]</font></h3>
  $else:
    <h3>$values["message"]</h3>

<form action="backup.cgi" method="POST" ENCTYPE="multipart/form-data">
<input type="hidden" name="command" value="restore">
バックアップファイル(ZIP形式):<input type="file" name="zip"><br/>
<input type="submit" value="設定ファイルを復元する">
</form>

</body></html>



HDEラボの桜井です。
3月もちょっと雪が降りそうですが、全国的には暖冬で少し心配です。

飲料水ネタが連発したので、Twistedネタでも。
Twistedは、いわゆる「イベント駆動型」のネットワークフレームワークです。
イベント駆動型ということは、非同期プログラミングということで、メソッドを実行したら登録したコールバック関数を実行する仕組みなのです。
(例、ajaxのxmlHttpRequest)
このコールバックの仕組みを提供するのが、Deferred(twisted.interneet.deferred)です。
以前書いたデータベース呼び出しのサンプルに、エラー処理を追加するためにDeferredオブジェクトを使ってみましょう。

About this Archive

This page is a archive of entries in the Python category from March 2009.

Python: February 2009 is the previous archive.

Python: April 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.