2013-03-26 60 views
4

一個HTTP錯誤響應我使用的發展而webapp2在App Engine中。我想要做的是在發生錯誤時發送自定義的JSON格式的響應。例如,當請求長度變長,一個閾值時,與HTTP 400和響應主體如何JSON格式webapp2的

{'error':'InvalidMessageLength'} 

在webapp2的響應,有分配錯誤處理程序某些例外的選項。例如:

app.error_handlers[400] = handle_error_400 

凡handle_error_400如下:

def handle_error_400(request, response, exception): 
    response.write(exception) 
    response.set_status(400) 

當執行webapp2.RequestHandler.abort(400),上述代碼被執行。

怎麼可能具有動態地基於上述設置不同的響應格式(HTML和JSON)?也就是說,如何調用handle_error_400函數的不同版本?

回答

5

這裏是工作的完整示例,演示瞭如何具有相同的錯誤處理對所有類型的錯誤,如果您的網址以/json開始那麼響應將是一個application/json(使用你的你如何能很好地利用想象力在request對象來決定你應該提供什麼樣的反應):

import webapp2 
import json 

def handle_error(request, response, exception): 
    if request.path.startswith('/json'): 
    response.headers.add_header('Content-Type', 'application/json') 
    result = { 
     'status': 'error', 
     'status_code': exception.code, 
     'error_message': exception.explanation, 
     } 
    response.write(json.dumps(result)) 
    else: 
    response.write(exception) 
    response.set_status(exception.code) 

app = webapp2.WSGIApplication() 
app.error_handlers[404] = handle_error 
app.error_handlers[400] = handle_error 

在上面的例子中,你可以很容易地通過visting以下URL測試不同的行爲,將返回一個404這是測試的最簡單的錯誤:

http://localhost:8080/404 
http://localhost:8080/json/404 
+0

非常感謝您的回覆! – 2013-03-27 01:25:50

+1

@ThanosMakris你非常歡迎。另外,如果你正在開始一個新項目,你可以檢查我的[gae-init](http://gae-init.appspot.com)項目,你可以在JSON(http://gae-init.appspot.com)/_s/user /),錯誤處理(http://gae-init.appspot.com/404或http://gae-init.appspot.com/_s/404)以及更多好東西。如果您有任何問題,您的反饋非常感謝,並且您還可以用希臘語寫信給我:) – Lipis 2013-03-27 02:03:19

+0

@ThanosMakris考慮將應用程序移植到gae-init分支。一旦Lipis塑造了框架,我們已經移植了我們所有的項目。昨天實際上我從我的公司移植了wepapp。靈活性,可維護性和最佳性能,絕對值得花時間,至少在調查中。你已經擁有或者隨着你的成長壯大而可能面臨的問題已經解決;) – topless 2013-03-27 08:45:29