处理(django)web应用程序中的服务器错误(500)

时间:2012-06-20 14:33:20

标签: ajax django error-handling

我编写了一个使用ajaxdjango的网络应用。它解析文件,从文件中收集一些数据,然后向用户显示处理数据的结果。

如果文件不是预期的格式,解析和数据处理将失败,程序会告诉用户该文件无法处理。

我试过这种方式

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视图中的运行时错误?你们有什么建议?

1 个答案:

答案 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

第三,我假设filenametype="file"的输入。如果是这种情况,那么无论如何它都不会存在于request.POST中。所有文件上传都会转到request.FILES。上述相同的注释适用:

filename = request.FILES.get('filename')
if filename is None:
    return HttpResponseBadRequest()
else:
    # the rest of your code

第四,parse_fileprocess_data似乎都是您创建的专有方法,因此无法在那里为您提供太多帮助。但是,每当你做任何可能失败的事情时,记住要明智地使用try...except块,例如从文件中读取数据,或者以假定的格式解析该数据,而这些格式实际上并不存在。

您的parse_fileprocess_data方法应该捕获所有可能的异常。然后他们可以向上传播它们,在它们的位置引发另一个自定义异常,或者只是无声地返回像None这样的东西。然后,您可以在此处进行相应的响应,捕获异常或分析返回值是否为None