首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

web.py笔记 大块文件上载

2012-09-19 
web.py笔记 大块文件下载?官方urlhttp://webpy.org/cookbook/streaming_large_files.zh-cn?有关yield的说

web.py笔记 大块文件下载

?

官方url

http://webpy.org/cookbook/streaming_large_files.zh-cn

?

有关yield的说明

从python的yield说起 http://lukejin.iteye.com/blog/587051

[Python 学习]2.5版yield之学习心得 http://blog.donews.com/limodou/archive/2006/09/04/1028747.aspx

?

关于yield的写法

以上两篇文章的写法我都懂,但是看web.py里面这个例子的时候,还是看不懂

?

count_holder通过iframe里面的url,调了4次count_down

访问一次127.0.0.1:8080/,相当于接连访问了

127.0.0.1:8080/10

127.0.0.1:8080/9

127.0.0.1:8080/8

127.0.0.1:8080/7?

4个url

所以继续看count_down的内容

count_down里有好几个yield

怎么能一口气就运行到底了呢?

?

?

后来才看见这句话

You can't mix basic string and Yield returns in the same method. If you use Yield, you'll have to use yield for everything because your function becomes a generator.

?

?

到此为止,个人理解,

1 ?用了yield就不能用return,yield相当于return + wait的关系

2 ?web.py会不断调用下面每个class的next方法,直到最后

?

做了个实验来证实

?

?

# Simple streaming server demonstration# Uses time.sleep to emulate a large file readimport webimport timeurls = (    "/",    "count_holder",    "/down",  "count_down",    )app = web.application(urls, globals())class count_down:    def GET(self,count):        print 'count_down'   class count_holder:    def GET(self):        web.header('Content-type','text/html')        web.header('Transfer-Encoding','chunked')                yield '1'            print 'step1'        yield '2'             print 'step2'        yield '3'                print 'step3'if __name__ == "__main__":    app.run()
?

?

?

运行?http://192.168.1.100:8080/? 后在控制台的结果果然是

?

?

step1

step2

step3

192.168.1.100:2069 - - [17/Feb/2012 22:09:38] "HTTP/1.1 GET /favicon.ico" - 200 OK

?

?

连放在yield下面的step3都打出来了真够可以。

?

?


?

?

最后结果,个人觉得比较实用的分块下载的例子是,很有java风格啊

http://www.cnblogs.com/QLeelulu/archive/2011/08/05/2128577.html

class download:    def GET(self):        file_name = 'file_name'        file_path = os.path.join('file_path', file_name)        f = None        try:            f = open(file_path, "rb")            webpy.header('Content-Type','application/octet-stream')            webpy.header('Content-disposition', 'attachment; filename=%s.dat' % file_name)            while True:                c = f.read(BUF_SIZE)                if c:                    yield c                else:                    break        except Exception, e:            print e            yield 'Error'        finally:            if f:                f.close()
?

热点排行