0

私はdjangoを使用してWebアプリを構築しています。そして、ページの1つは、さまざまなファイル(さまざまなファイルタイプ)を送信します。私は6つのファイルタイプを持っています。そして、私の現在のバージョンのコード(それは本当に悪いです-それが私がこの質問を書く理由です)は次のとおりです:

    try:
        file = request.FILES[u'file_doc']
    except MultiValueDictKeyError:
        try:
            file = request.FILES[u'file_fb2']
        except MultiValueDictKeyError:
            try:
                file = request.FILES[u'file_pdf']
            except MultiValueDictKeyError:
                try:
                    file = request.FILES[u'file_txt']
                except MultiValueDictKeyError:
                    try:
                        file = request.FILES[u'file_other']
                    except MultiValueDictKeyError:
                        try:
                            file = request.FILES[u'file_chm']
                        except MultiValueDictKeyError:
                            return HttpResponse('bad file type')

この悪いコードの平和を改善する方法を教えてください。

TIA!

4

4 に答える 4

6

このinテストでは、キーが辞書の一部であるかどうかを確認できます。

if u'file_doc' in request.FILES:
    file = request.FILES[u'file_doc']

テストする一連のキーを単純にループできます。

for key in (u'file_doc', u'file_fb2', .. ):
    if key in request.FILES:
        file = request.FILES[key]
        break
else:
    return HttpResponse('bad file type')

for ループがステートメントに到達せずに完了した場合、つまり、一致するキーが見つからなかった場合にのみelseスイートが実行されます。break

ループ内で例外アプローチを引き続き使用できることに注意してください。

for key in (u'file_doc', u'file_fb2', .. ):
    try:
        file = request.FILES[key]
        break
    except MultiValueDictKeyError:
        pass
else:
    return HttpResponse('bad file type')

しかし、それがより読みやすいかどうかはわかりません。

于 2012-08-02T18:17:18.500 に答える
3

次のようなことができます。

filetypes = [ u'file_doc', u'file_fb2', u'file_pdf' ]

file = None
for ft in filetypes:
  if ft in request.FILES:
    file = request.FILES[ft]
    break

if file is None:
  return HttpResponse('bad file type')
于 2012-08-02T18:18:31.743 に答える
2

request.FILES.get(u'file_doc', DEFAULT_VALUE)キーが辞書に存在しない場合、DEFAULT_VALUE を返します。inMartijn editで言及されているキーワードを使用することもできます。django MultiValueDictKeyError エラーも参照してください。

于 2012-08-02T18:18:01.960 に答える
1
def GetFile(request):
    file_types = "doc fb2 pdf txt other chm".split()
    for k in file_types:
        if "file_{0}".format(k) in request.FILES:
             return request.FILES["file_{0}".format(k)]

少なくともそれは私がそれを行う方法です

于 2012-08-02T18:20:19.710 に答える