gpt4 book ai didi

ajax - 在(Django)Web应用程序中处理服务器错误(500)

转载 作者:行者123 更新时间:2023-12-03 08:35:18 25 4
gpt4 key购买 nike

我已经编写了一个使用ajaxdjango的Web应用程序。它解析一个文件,从文件中收集一些数据,然后向用户呈现处理数据的结果。

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

我这样尝试

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服务器时,即使django View 中出现500错误,此方法也可以正常工作。服务器控制台显示500错误,但仍然正常运行。我想知道是否将其部署在生产环境中。

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

最佳答案

这里的问题是您没有真正响应错误。只要请求是通过AJAX作为POST发送的,success始终是True。这告诉您关于文件是可以被解析还是乱七八糟的信息,即使文件已被上传也是如此。

首先,因为没有request.post,所以您的代码当前总是会失败(500错误);它应该是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分支。

关于ajax - 在(Django)Web应用程序中处理服务器错误(500),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11121903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com