0

我编写了一个使用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中,我有一个检查 .If 状态的功能ajax querystatus is not 'success'它会显示一条错误消息。

当我使用 django 服务器时,即使 django 视图中出现 500 错误,这也有效。服务器控制台显示 500 错误,但仍然顺利进行。我想知道如果它部署在生产环境中是否会出现这种情况。

有没有更好的方法来处理 django 视图中的运行时错误?你们有什么建议?

4

1 回答 1

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_fileandprocess_data方法应该捕获所有可能的异常。然后他们可以向上传播它们,在他们的位置引发另一个自定义异常,或者只是默默地失败返回类似None. 然后由您的视图在这里做出相应的响应,捕捉异常或分支返回值是否None存在。

于 2012-06-20T15:31:32.680 回答