通过视图在Django中提供静态文件
我正在写一个Django应用程序,用户在满足一些条件后可以下载文件(比如需要先登录)。这个文件在其他情况下是不能访问的。
通过Apache服务器提供文件是不行的:我需要在数据库中检查用户的权限。而且,我也没有权限去修改Apache的配置。
所以我想在Django中读取这个文件,然后设置合适的头信息,把它发送给用户。
我参考了Django手册中的这个页面来设置头信息。
我有以下代码:
#<- 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 个回答
4
你需要以二进制模式打开文件(可以参考文档)。
就像这样:
file = open(location, 'rb')
我不知道这对你是否适用(因为你不能更改Apache的设置),但我建议使用Lighttpd + mod_secdownload,这样可以提高性能。这种优雅的解决方案利用了Lighttpd在提供静态内容时的优化,同时将授权决策交给第三方(在你的情况下是Django)。