首先,您应该考虑要暴露哪些错误:
在我看来,对于正确的 Ajax 请求,您应该返回一个状态代码,然后返回一些 json 来帮助理解发生的事情,例如消息和解释(如果适用)。
如果您的目标是使用 ajax 提交信息,我建议为您想要的设置一个 form。这样您就可以轻松通过一些验证过程。我将假设示例中的情况是这样的。
第一 - 请求是否正确?
def test_view(request):
message = None
explanation = None
status_code = 500
# First, is the request correct?
if request.is_ajax() and request.method == "POST":
....
else:
status_code = 400
message = "The request is not valid."
# You should log this error because this usually means your front end has a bug.
# do you whant to explain anything?
explanation = "The server could not accept your request because it was not valid. Please try again and if the error keeps happening get in contact with us."
return JsonResponse({'message':message,'explanation':explanation}, status=status_code)
第二 - 表格是否有错误?
form = TestForm(request.POST)
if form.is_valid():
...
else:
message = "The form has errors"
explanation = form.errors.as_data()
# Also incorrect request but this time the only flag for you should be that maybe JavaScript validation can be used.
status_code = 400
您甚至可能逐个字段地得到错误,因此您可以在表单本身中以更好的方式呈现。
第三次 - 让我们处理请求
try:
test_method(form.cleaned_data)
except `PermissionError` as e:
status_code= 403
message= "Your account doesn't have permissions to go so far!"
except `Conflict` as e:
status_code= 409
message= "Other user is working in the same information, he got there first"
....
else:
status_code= 201
message= "Object created with success!"
根据您定义的例外情况,可能需要不同的代码。转到Wikipedia 并查看列表。
不要忘记响应也因代码而异。如果你向数据库中添加一些东西,你应该返回一个201。如果您刚刚获得信息,那么您正在寻找 GET 请求。
回答问题
-
如果不处理,Django 异常将返回 500 个错误,因为如果您不知道会发生异常,那么它就是服务器中的错误。除了 404 和登录要求外,我会为所有事情做 try catch 块。 (对于 404,您可以提出它,如果您这样做 @login_required 或需要权限,django 将使用适当的代码进行响应,而无需您做任何事情)。
-
我不完全同意这种方法。正如您所说,错误应该是明确的,因此您应该始终知道假设会发生什么以及如何解释它,并使其依赖于所执行的操作。
-
我会说 400 错误是可以的。这是一个糟糕的请求,您只需要解释原因,错误代码适用于您和您的 js 代码,因此请保持一致。
-
(提供的示例)- 在text_view 中,您应该拥有test_method,如第三个示例所示。
测试方法应具有以下结构:
def test_method(validated_data):
try:
my_business_logic_is_violated():
catch BusinessLogicViolation:
raise
else:
... #your code
在我的例子中:
try:
test_method(form.cleaned_data)
except `BusinessLogicViolation` as e:
status_code= 400
message= "You violated the business logic"
explanation = e.explanation
...
我认为业务逻辑违规是客户端错误,因为如果在该请求之前需要某些东西,客户端应该意识到这一点并要求用户先做。 (来自Error Definition):
400(Bad Request)状态码表示服务器不能或
由于某些被认为是
客户端错误(例如,格式错误的请求语法、无效请求
消息框架或欺骗性请求路由)。
顺便说一句,您可以看到Python Docs on User-defined Exceptions,这样您就可以给出适当的错误消息。此示例背后的想法是,您根据生成位置在my_business_logic_is_violated() 中引发带有不同消息的BusinessLogicViolationexception。