0

我使用 django 构建我的网络应用程序。其中一个页面发送不同的文件(具有不同的文件类型)。我有 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')

你能告诉我 - 如何改善这种糟糕的代码和平。

蒂亚!

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。您也可以使用Martijn编辑in提到的关键字, 另请参阅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 回答