2012-12-08 11 views
5

istisnalarımı kırdı JSON istemcimi kırmak. Bu çıkışı onaylamak istiyorum.API'si, JSON'u döndürür ancak HTML istisnaları, HTML'de döndürülen JSON istemcisi

Daha fazla ayrıntı: Bu api uygulamasının son noktasını görüntüleyen bir işlevim var.

Gördüğünüz gibi, bu işlev sonucu json olarak döndürür.

@app.route('/route1') 
def api_route1(): 
    if user_id in request.args: 
     k1 = request.args['user_id'] 
     return flask.jsonify(recs=some_function(k1)) 
    else: 
     return "no valid user_id supplied" 

sorun, işlenmeyen özel durum

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 
    Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
    <head> 
     <title>TypeError: 'NoneType' object is not iterable // Werkzeug Debugger</title> 
     <link rel="stylesheet" 
      href="?__debugger__=yes&amp;cmd=resource&amp;f=style.css" 
      type="text/css"> 

Bu benim json istemci kırar, örneğin HTML, içindedir. HTML formatı açıkça bir varsayılandır, ancak nasıl devre dışı bırakılacağını bilmiyorum ve jsonified istisnaları belirtin (ve ideal olarak başlıkları bile döndüren herhangi bir şeyi jsonify).

İhtiyacım olan şey, mükemmel Flask belgelerinde bir yerde olduğunu sanıyorum, ama bulamıyorum.

+0

Yani bir şeyler yanlış giderse hata iletilerini korumaya ve JSON olarak göndermeye çalışıyorsunuz? – Blender

+0

@Blender, evet, istediğim buydu. – doug

cevap

4

Geri izlemenin JSON istemcisine erişilebilir hale getirilmesi, hassas bilgilerin açığa çıkma potansiyeline sahiptir.

Benim tavsiyem:

  • dönüş ayıklama kapalı
  • sentry gibi bir günlük toplama aracı bu uygulama için hata 500 sayfa json formatında bir jenerik hata döndürür yapmak yüklemek

500 sayfa şöyle görünebilir:

{ "error": "500 - internal server error" } 
+0

OP'nin yapması gereken budur. – sberry

1

Aşağıdaki kod hile yapmalıdır. Bu sebeple, yükseltilmiş olabilecek herhangi bir istisnayı yakalamak, traceback modülünü kullanarak bir dize olarak biçimlendirilen istisna ayrıntılarını almak ve sonra geçerli json olarak döndürmek. Gerçekleştirmeniz gereken ana hata türlerini ve daha okunabilir bir hata iletisini içeren bir grup beyanı eklemenizi öneririm. O zaman tuhaf ve beklenmedik bir şey olması durumunda hepsini yakalama dışında bir son verebilirsiniz.

import traceback 

@app.route('/route1') 
def api_route1(): 
    if user_id in request.args: 
     try: 
      k1 = request.args['user_id'] 
      return flask.jsonify(recs=some_function(k1)) 
     except: 
      return flask.jsonify(exception=traceback.format_exc()) 
    else: 
     return flask.jsonify(exception="no valid user_id supplied") 
+0

bile diğer bölüm jsonify olabilir, bu tekrar user_id argümanlarda değilken html döndürür. – Codeanu

+0

@Codeanu iyi bir öneri, cevabını önerdiğin şeyle güncelledim. –

6

HTTP tanımlamalıdır error handlers in flask.

böyle bir şey görünebilir 404 işleyicisi returing basit JSON: sizi varsa

@app.errorhandler(404) 
def page_not_found(e): 
    return flask.jsonify(error=404, text=str(e)), 404 

bu ile istemci üzerinde data.error kontrol etmek mümkün olacak ve data.text ile hata metni alabilirsiniz (e olarak iletilen hata, dize gösterimi "404: Bulunamadı" olan werkzeug.exceptions.NotFound).

İlgili konular