2013-08-06 24 views
10

Şu anda üzerinde çalıştığım bir uygulama için REST API'si yazıyorum. Uygulama flask kullanarak python ile yazılmıştır. Ben şu var:Python flask ve özel istemci hata iletileri

try: 
    _profile = profile(
     name=request.json['name'], 
     password=profile.get_salted_password('blablabla'), 
     email=request.json['email'], 
     created_by=1, 
     last_updated_by=1 
    ) 
except AssertionError: 
    abort(400) 

session = DatabaseEngine.getSession() 
session.add(_profile) 
try: 
    session.commit() 
except IntegrityError: 
    abort(400) 

hata işleyicisi şuna benzer: Bir sqlalchemy modeli doğrulayıcı ve benzersiz kısıtlama ile ilgili bir sorun hem belirtmek için hata 400 kullanıyorum

@app.errorhandler(400) 
def not_found(error): 
    return make_response(standard_response(None, 400, 'Bad request'), 400) 

veritabanına yazma ve her iki durumda da aşağıdaki hata istemciye gönderilir:

{ 
    "data": null, 
    "error": { 
    "msg": "Bad request", 
    "no": 400 
    }, 
    "success": false 
} 

hala (400 iptaline kullanmak için bir yolu var mı) aynı zamanda hatayı, hata işleyicisinin sonuçtaki hata nesnesi için ek bilgi eklemeye başlayabilmesi için bir şekilde ayarlamasını sağladı.

Ben doğrultusunda daha olmasını istiyorum: doğrudan iptale özel bir yanıtını koyabilirsiniz

{ 
    "data": null, 
    "error": { 
    "msg": "(IntegrityError) duplicate key value violates unique constraint profile_email_key", 
    "no": 400 
    }, 
    "success": false 
} 

cevap

6

errorhandler yanı tip bir istisna alabilir:

@app.errorhandler(AssertionError) 
def handle_sqlalchemy_assertion_error(err): 
    return make_response(standard_response(None, 400, err.message), 400) 
+0

Yup, aradığım şey buydu. Bir "yakalama" gibi bir işleyiciye bağlı olmayan hataları yakalamanın bir yolu var, bu yüzden ben de bunu müşteriye biçimlendirebilir ve halledebilirim? – Asken

+1

anladı. '@ app.errorhandler (Özel Durum)' – Asken

+0

Bu make_response ve standard_response benim için çalışmaz. Ama bu yapar: "def handle_sqlalchemy_error (err): return err.message, 400" –

8

() fonksiyonu: Alternatif

abort(make_response("Integrity Error", 400)) 

, içeri koyabilirsiniz hata işleyicisi işlevi

@app.errorhandler(400) 
def not_found(error): 
resp = make_response("Integrity Error", 400) 
return resp 
+0

Çıktının üretilmesi için çalışır ancak hata 400 işleyicisi çağrılmıyor gibi görünüyor. Ben bunu yapıyorum. Hata işleyicilerinde oturum açma yapmayı planladığımdan beri orada bitmenin bir yolu var mı? – Asken

+0

emin. güncellenmiş cevabımı gör – codegeek

+0

Evet, o zamandan beri işe yaramayacağım çünkü tüm 400'lerin 'Bad Request' yerine 'Integrity Error' olacak nerede başladım. Her iki özel hata metnini de yapmam gerekiyor ** ve ** hata işleyicide bitiyor. :) – Asken

0

Biliyorum oyuna geç kaldım, ama başka bir çözüm isteyen herkes için, benim cevabım @codegeek'e dayanıyor.

def duplicate(message=""): 
    response = make_response() 
    response.status_code = 409 
    response.headers = { 
     "X-Status-Reason" : message or "Duplicate entry" 
    } 
    abort(response) 

sonra ben bu bir yanıt kontrol etmek benim angularjs app kolaylaştırır

ServerResponse.duplicate('Duplicate submission. An article with a similar title already exists.') 

çağırabilirsiniz:

benim ServerResponse.py modülünde aşağıdaki ile benzer bir şey başarmak başardı durumu ve X-Status-Reason varsayılan veya özelleştirilmiş iletiyi görüntüleyin

İlgili konular