5

Django で ReportLab を使用していくつかの pdf を生成しています。私はこの質問に与えられた答えに従って実験し、その中の二重引用符が意味をなさないことに気付きました:

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

どうしてこれなの?ファイルシステムのスラッグ風のサニタイズに関係しているだけですか?

4

3 に答える 3

2

この質問の調査から、実際にはエンコーディング/エスケープを行っているのはブラウザであると思われます。cURLDjango 自体がこれらのヘッダーをエスケープしないことを確認していました。まず、最小限のテスト ビューを設定します。

# 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. 引用符はまだそこにあります!

于 2012-08-16T19:32:05.000 に答える
0

Python は、ファイル名の二重引用符をハイフンに変換しません。

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

あまりにも変な名前を使うことを許さないのはおそらく django でしょう。

とにかく、移植性の問題を避けるために、ファイル名には次の文字のみを使用することをお勧めします。

  • 文字 [az][AZ]
  • 数字 [0-9]
  • ハイフン(-)、アンダースコア(_)、プラス(+)

注:適切な引用符を使用せず、そのようなファイル名で壊れるスクリプトがたくさんあるため、リストから空白を除外しました。

この文字セットに制限すれば、パス名で問題が発生することはおそらくないでしょう。明らかに、他の人や他のプログラムはまだこの「ガイドライン」に従っていない可能性があるため、この規則がユーザーまたは他の外部ソースから取得したパスと共有されていると想定しないでください。

于 2012-08-16T19:07:42.727 に答える
-1

あなたの使い方は少し間違っています。スペースなどを考慮して、ファイル名全体を引用符で囲む必要があります。

変化する:

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

に:

response['Content-Disposition'] = 'inline; filename="constant_%s_%s.pdf"'\
% ('foo','bar')
于 2012-08-16T19:15:07.563 に答える