通过Django中的视图提供静态文件

时间:2010-08-21 22:04:21

标签: python django

我正在编写一个Django应用程序,让你在满足一些要求后下载文件(例如,你必须登录)。否则该文件需要无法访问。

通过Apache提供文件将无法正常工作:我必须在数据库中检查用户的权限。此外,无权更改我的Apache配置。

所以我想在Django中读取文件,然后设置适当的标题并将其发送到客户端。

我使用了Django手册中this页面上的信息来获取标题。

我有以下代码:

#<- check persmissons here, continue if allowed ->

#read the pdf file
location = 'file.pdf'
file = open(location, 'r')
content = file.read()
file.close

#serve the file
response = HttpResponse(content, mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=filename.pdf'

return response

但是,下载的文件似乎已损坏:无法在Adobe Reader中打开。 我想也许这可能是一些编码问题,但我无法弄明白。

感谢任何帮助:)

1 个答案:

答案 0 :(得分:4)

您必须以二进制模式open()文件(考虑docs)。

就像这样:

file = open(location, 'rb')

我不知道它是否适用于您(因为您不允许更改Apache的设置),但出于性能原因,我建议使用Lighttpd + mod_secdownload。这个优雅的解决方案利用Lighttpd优化服务静态内容,同时将授权决策委托给第三方(在您的情况下为Django)。