所有你應該想想你要揭露什麼錯誤首先:
有了這個主意是我一個正確的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(錯誤請求)狀態代碼表示該服務器不能或 不會請求過程中由於一些被認爲是 客戶端錯誤(例如,惡意請求語法,無效請求
消息框架或欺騙性請求路由)。
順便說一句,請參閱Python Docs on User-defined Exceptions,以便您可以給出相應的錯誤消息。此示例背後的想法是,根據生成的地方,您在my_business_logic_is_violated()
中使用不同的消息提出BusinessLogicViolation
例外。
這是我在網站上看到的最佳答案。非常感謝你的解釋。我會選擇打勾接受這個答案。只是一個小問題。您能否通過提交代碼片段來明確解釋my_business_logic違規如何適合整個圖片 –
NBajanca,Google Chrome無法識別428錯誤(雖然可以使用IE)。您能否請您建議哪種錯誤代碼最適合當您想因爲業務邏輯不正確而引發錯誤時的情況? –
@EdgarNavasardyan我認爲它應該是一個錯誤400.我找不到一個更好的代碼來描述這一點,它顯然是從服務器的角度來看無效的請求。我更新了答案以更好地解釋它。 – NBajanca