tornado如何写出提供下载的页面

socket 发布于 2013/11/26 21:38
阅读 3K+
收藏 2
我在download目录下存放了一些图片文件,想在网页中提供下载,不知道怎么提供下载: 

我的index.html: 

<html> 
<head> 
    <title>down</title> 
</head> 
<body> 
<ul> 
    {%for f in files%} 
    <li><a href="download/{{escape(f)}}"/>{{escape(f)}}</li> 
    {%end%} 
</ul> 
</body> 
</html>

我的website.py文件:

import tornado.web 
import tornado.ioloop 
from tornado.options import define,options,parse_command_line 
define('port',default=8888,help='run on the port',type=int) 

files=['a.jpg','b.jpg','c.jpg','d.jpg']
 
class DownHandler(tornado.web.RequestHandler): 
  def get(self,fileName): 
  self.render('index.html',files=files) #这样肯定是不行的,不知道怎么搞了。。。

if __name__=='__main__': 
  parse_command_line() 
  app=tornado.web.Application( 
  [ 
    (r'/download/(\w+)',DownHandler), 
  ], 
  ) 

  app.listen(options.port) 
  tornado.ioloop.IOLoop.instance().start()
实在是想不出来怎么做了,按照我的写法是下不下来文件的,求指导怎么搞起~
加载中
1
yio
yio
要设response header,用set_header,就设成二楼说那个,话说tornado源码不多,而且注释很详细,这些问题在源码中都能找到答案。其实还有种比较简单的方法,把要下载的文件放在static目录直接访问就是了。
socket
socket
又尝试了一下,做到了~哈哈哈~就是static_url~谢谢谢谢~哈哈哈哈
1
mallon
mallon
不要用模板,设计一个RequestHandler对应专门的下载URL,响应MIME类型设置为 application/octet-stream即可
socket
socket
你说的是4楼@郭煜 大神写的那样的吗?我试了还是不对,tornado怎么设置响应MIME类型呢?百度上没有搜出来。。。
1
乌龟壳
乌龟壳
class DownHandler(tornado.web.RequestHandler): 
  def get(self,fileName): 
    with open(fileName, "rb") as f:
      return f.read()




socket
socket
我试了一下还是不对,如果是文本文件响应是200但是没有下载的样子,如果是图片文件就是404了,是哪里的问题呢?
1
乌龟壳
乌龟壳
class DownHandler(tornado.web.RequestHandler): 
  def get(self,fileName):
    print(fileName)
    with open("download\\" + fileName, "rb") as f:
      self.set_header('Content-Type','application/octet-stream')
      self.write(f.read())

这种写法主要是在一些要控制下载权限的场合,如果不需要,放到静态文件等目录去下载就是了



socket
socket
非常感谢!!
0
13123123
13123123
python 技术  好牛逼
0
mallon
mallon
汗,仔细看了一下,你完全不具备Tornado所需要的HTTP基础知识...如果觉得不行,还是换Django吧
socket
socket
我坚持tornado试试哈~~
乌龟壳
乌龟壳
学web建议还是了解下HTTP,现在花的时间会让未来的路走得更宽。
0
socket
socket

引用来自“yio”的答案

要设response header,用set_header,就设成二楼说那个,话说tornado源码不多,而且注释很详细,这些问题在源码中都能找到答案。其实还有种比较简单的方法,把要下载的文件放在static目录直接访问就是了。
class DownHandler(tornado.web.RequestHandler):
	def get(self,fileName):
		self.set_header('Content-Type','application/octet-stream')
		f=open('download/'+fileName,'rb')
		return f.read()



我加了set_header还是不对的,这个我按照你说的再去源码里看看;你说的第二个方法放到static目录下直接访问是不是要配置nginx的那种?只用tornado是不是做不到的?
乌龟壳
乌龟壳
Tornado用的不多,徒手写的,回头调试下。
返回顶部
顶部