我编写了一个使用ajax
和django
的网络应用。它解析文件,从文件中收集一些数据,然后向用户显示处理数据的结果。
如果文件不是预期的格式,解析和数据处理将失败,程序会告诉用户该文件无法处理。
我试过这种方式
def process_file(request):
success = False
return_dict = {}
...
if (request.is_ajax()) and(request.method == "POST"):
filename = request.POST['filename']
...
data = parse_file(filename)
results = process_data(data)
success = True
return_dict = {'result':results}
serialized = json.dumps(return_dict)
if success == True:
return HttpResponse(serialized,mimetype="application/json")
else:
return HttpResponseServerError(serialized, mimetype="application/json")
在javascript
中,我有一个检查ajax query
状态的函数。如果status is not 'success'
,则会显示错误消息。
即使django视图中有500错误,当我使用django服务器时,这也有效。服务器控制台显示500错误但仍然没有故障。我想知道如果在生产环境中部署它是否会出现这种情况。
有没有更好的方法来处理django视图中的运行时错误?你们有什么建议?
答案 0 :(得分:1)
这里的问题是你没有真正回应错误。只要请求是通过AJAX作为POST发送的,success
总是 True
。即使文件是上传,也无法解析文件是否可以被解析或哎呀。
首先,您的代码目前总是失败(500错误),因为没有request.post
;它应该是request.POST
。
其次,只要你需要从request.POST
中提取一个值,就应该总是dict.get
,即:
filename = request.POST.get('filename')
如果在POST数据中找不到该字段,则filename
将等于None
。因此,如果filename
不是None
,则应该对此进行分支,仅继续使用其余代码,例如:
if filename is None:
return HttpResponseBadRequest()
else:
# the rest of your code
第三,我假设filename
是type="file"
的输入。如果是这种情况,那么无论如何它都不会存在于request.POST
中。所有文件上传都会转到request.FILES
。上述相同的注释适用:
filename = request.FILES.get('filename')
if filename is None:
return HttpResponseBadRequest()
else:
# the rest of your code
第四,parse_file
和process_data
似乎都是您创建的专有方法,因此无法在那里为您提供太多帮助。但是,每当你做任何可能失败的事情时,记住要明智地使用try...except
块,例如从文件中读取数据,或者以假定的格式解析该数据,而这些格式实际上并不存在。
您的parse_file
和process_data
方法应该捕获所有可能的异常。然后他们可以向上传播它们,在它们的位置引发另一个自定义异常,或者只是无声地返回像None
这样的东西。然后,您可以在此处进行相应的响应,捕获异常或分析返回值是否为None
。