我使用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')
你能告诉我 - 如何改善代码的糟糕和平。
TIA!
答案 0 :(得分: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')
但我不太确定它更具可读性。
答案 1 :(得分: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')
答案 2 :(得分:2)
request.FILES.get(u'file_doc', DEFAULT_VALUE)
将返回DEFAULT_VALUE。您还可以使用Martijn提到的in
关键字
修改另请参阅django MultiValueDictKeyError error, how do i deal with it
答案 3 :(得分: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)]
至少我会怎么做