为什么python双引号在文件名中转换为连字符?

时间:2012-08-06 20:56:08

标签: python django string reportlab

我在Django中使用ReportLab生成一些pdf。我跟着并试验了给this question的答案,并意识到其中的双引号没有意义:

response['Content-Disposition'] = 'inline; filename=constant_"%s_%s".pdf'\
% ('foo','bar')

提供文件名constant_-foo_bar-.pdf

response['Content-Disposition'] = 'inline; filename=constant_%s_%s.pdf' \
% ('foo','bar')

提供文件名constant_foo_bar.pdf

这是为什么?它只是与文件系统的slug-esque sanitisation有关吗?

3 个答案:

答案 0 :(得分:2)

this question的研究看来,它实际上是浏览器进行编码/转义。我使用cURL来确认Django本身不会逃避这些标头。首先,我设置了一个最小的测试视图:

# views.py 
def index(request):
    response = render(request, 'template.html')
    response['Content-Disposition'] = 'inline; filename=constant"a_b".html'
    return response

然后跑了:

carl@chaffinch:~$ HEAD http://localhost:8003
200 OK
Date: Thu, 16 Aug 2012 19:28:54 GMT
Server: WSGIServer/0.1 Python/2.7.3
Vary: Cookie
Content-Type: text/html; charset=utf-8
Client-Date: Thu, 16 Aug 2012 19:28:54 GMT
Client-Peer: 127.0.0.1:8003
Client-Response-Num: 1
Content-Disposition: inline; filename=constant"a_b".html

查看标题:filename=constant"a_b".html。报价仍在那里!

答案 1 :(得分:0)

Python不会将双引号转换为文件名中的连字符:

>>> with open('constant_"%s_%s".pdf' % ('foo', 'bar'), 'w'): pass
    $ ls
    ...
    constant_"foo_bar".pdf
    ...

可能是django不允许你使用太奇怪的名字。

无论如何,我建议在文件名中仅使用 以下字符,以避免可移植性问题:

  • 字母[a-z] [A-Z]
  • digits [0-9]
  • 连字符( - ),下划线(_),加号(+)

注意:我已经排除了列表中的空格,因为有很多脚本没有使用正确的引用,并且打破了这些文件名。

如果你限制自己使用这组字符,你可能不会遇到任何路径名问题。显然,其他人或其他程序可能仍然不遵循此“指南”,因此您不应假设此约定由您从用户或其他外部来源获得的路径共享。

答案 2 :(得分:-1)

您的使用略有不正确。您可能需要围绕整个文件名的引号,以便考虑空格等。

变化:

response['Content-Disposition'] = 'inline; filename=constant_"%s_%s".pdf'\
% ('foo','bar')

为:

response['Content-Disposition'] = 'inline; filename="constant_%s_%s.pdf"'\
% ('foo','bar')