在cherrypy.lib.static.py有如下方法:serve_file對於任何文件對象
serve_file(path, content_type=None, disposition=None, name=None)
其中變量「路徑」必須是一個真實的文件(絕對路徑)。有沒有類似的服務任何Python文件對象?
在cherrypy.lib.static.py有如下方法:serve_file對於任何文件對象
serve_file(path, content_type=None, disposition=None, name=None)
其中變量「路徑」必須是一個真實的文件(絕對路徑)。有沒有類似的服務任何Python文件對象?
從學習http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py我不得不說,不:serve_file
函數是「單片」,並且它自己的bodyfile = open(path, 'rb')
,似乎也沒有任何替代方法。可惜,因爲它很容易重構函數並添加另一個例如serve_open_file
來覆蓋你的情況,既委託給一個內部函數的「硬」邏輯,如multipart/byteranges服務。可能值得你在cherrypy.org上打開一個功能請求(「增強門票」) - 可能不是一個殺手級的功能,但我可以看到使用案例,並且實現它對櫻桃人來說並不難(訪問their site並按照頁面上的說明「登錄」)。
如果我理解正確,我認爲這個答案不再是真實的,增加了'serve_fileobj`方法。 – 2011-09-08 19:59:22
是的,serve_filobj完全符合OP的要求。 (此答案已過時。) – 2012-12-17 12:34:49
重新看看http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py,看起來好像serve_fileobj
完全符合您的要求。
編輯:我已經試過這個,它只渲染文件內容到屏幕上,而不是允許下載文件。
只要您的文件或文件類對象是可迭代的,只需從您的處理函數而不是字符串中返回即可。
更新:
爲它服務的下載,設置Content-Type和Content-Disposition的頭,像這樣:
cherrypy.response.headers["Content-Type"] = "application/x-download"
cd = 'attachment; filename="%s"' % name
cherrypy.response.headers["Content-Disposition"] = cd
或者,在最新版本的cherrypy/lib/static.py
使用serve_fileobj
功能,這爲你做了更多。
serve_fileobj函數適用於此。 (如果你接受正確的答案,對社區會有所幫助。) – 2012-12-17 12:34:18