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

2 投票
1 回答
1944 浏览
提问于 2025-04-16 03:07

我正在写一个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)。

撰写回答