Django:为某些URL禁用APPEND_SLASH

时间:2012-03-16 14:50:37

标签: django

我有一个视图,使用nginx'X-Accel-Redirect标头保护某些敏感文件免受公共下载。我的网址如下所示:

url(r'^dl/f/(?P<pk>\d+)/(?P<filename>[^/]+)$', 'file_download.views.download', name='download-filename'),

pk是数据库中文件对象的主键,filename是文件名,它匹配除正斜杠之外的任何内容。它主要是在那里,以便浏览器知道文件名,以防用户想要保存它。请注意,没有终端斜杠。

当我在浏览器中打开匹配的URL时,Django会将其重定向到相同的URL并附加斜杠。该文件显示在浏览器中(它是PDF),但如果我想保存它,浏览器会建议使用通用的“download.pdf”而不是文件名。

我不想为一般情况禁用APPEND_SLASH,但是我可以以某种方式解决这个案例吗?

/ edit:遗憾的是,我无法使用Content-Disposition: attachment标头,因为所有其他文件的服务也没有该标头,并且需要保护受保护文件和不受保护文件的一致行为。

1 个答案:

答案 0 :(得分:1)

我不知道文档中的位置/是否存在,但我认为在网址中添加扩展名会阻止此行为,因此请使用some-filename/代替some-filename.pdf而不是Content-Disposition。相应地,urlpattern)。

但是,我对此并不完全确定。实际上,您的主要问题似乎是下载的文件名设置不正确,并且可以修复,而不会以某种方式弄乱URL。只需存储响应而不是立即返回响应,然后更改response = HttpResponse(mimetype='application/pdf') response['Content-Disposition'] = 'attachment; filename=somefilename.pdf' 标题:

\.\w{3,4}

<强>更新

关于评论中的两点:

  1. urlpattern可以接受通配符扩展名{{1}}。

  2. '附件'是强制下载的原因。 'inline'可用于在浏览器中加载文件。文件名可以以任何方式断言。