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

Python 通过Django中的视图提供静态文件,python,django,Python,Django,我正在编写一个Django应用程序,让您在满足某些要求后下载一个文件(例如,您必须登录)。否则该文件需要不可访问 通过Apache提供文件将不起作用:我必须在数据库中检查用户的权限。此外,我没有更改Apache配置的权限 因此,我想在Django中读取该文件,然后设置适当的头并将其发送到客户端 我使用Django手册第页上的信息作为标题 我有以下代码: #<- check persmissons here, continue if allowed -> #read the pdf

我正在编写一个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
#
#阅读pdf文件
位置='file.pdf'
文件=打开(位置“r”)
content=file.read()
file.close
#归档
response=HttpResponse(内容,mimetype='application/pdf')
响应['Content-Disposition']='附件;filename=filename.pdf'
返回响应
但是,下载的文件似乎已损坏:无法在Adobe Reader中打开。 我想这可能是编码问题,但我想不出来

非常感谢您的帮助:)

您必须
以二进制模式打开()
文件(请考虑)

就这样,

file = open(location, 'rb')

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

谢谢,@Ignacio。我不知道Apache world有类似的解决方案。