2013-08-06 41 views
10

Tôi hiện đang viết một API REST cho một ứng dụng tôi đang làm việc. Các ứng dụng được viết bằng python sử dụng bình. Tôi có những điều sau đây:Bình Python và thông báo lỗi khách hàng tùy chỉnh

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) 

Việc xử lý lỗi trông như thế này:

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

Tôi đang sử dụng lỗi 400 để chỉ cả một vấn đề với một mô hình SQLAlchemy validator một hạn chế duy nhất khi ghi vào cơ sở dữ liệu và trong cả hai trường hợp, lỗi sau được gửi cho khách hàng:

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

Có cách nào vẫn sử dụng hủy bỏ (400)) nhưng cũng đặt lỗi bằng cách nào đó để trình xử lý lỗi có thể xử lý thêm thông tin bổ sung cho đối tượng lỗi trong kết quả?

Tôi muốn nó được phù hợp hơn với:

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

Trả lời

6

errorhandler cũng có thể loại ngoại lệ:

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

Yup, đây là cái tôi đang tìm kiếm. Có cách nào để bắt lỗi không bị ràng buộc với một xử lý như một "bắt tất cả" vì vậy tôi có thể định dạng và xử lý cho khách hàng quá? – Asken

+1

tải xuống. '@ app.errorhandler (Ngoại lệ)' – Asken

+0

Make_response và standard_response đó không hoạt động đối với tôi. Nhưng điều này không: "def handle_sqlalchemy_error (err): return err.message, 400" –

8

bạn có thể trực tiếp đặt một phản ứng tùy chỉnh trong abort() chức năng:

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

Ngoài ra, bạn có thể đặt nó trong chức năng xử lý lỗi

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

Nó hoạt động để tạo đầu ra nhưng có vẻ như trình xử lý lỗi 400 không được gọi nếu Tôi làm việc này. Có cách nào để vẫn kết thúc ở đó kể từ khi tôi đã được lập kế hoạch làm một số đăng nhập trong xử lý lỗi? – Asken

+0

chắc chắn. xem câu trả lời cập nhật của tôi – codegeek

+0

Vâng, điều đó sẽ không hoạt động kể từ đó tôi trở lại nơi tôi bắt đầu, nơi tất cả 400 sẽ là 'Lỗi toàn vẹn' thay vì 'Yêu cầu sai'. Tôi cần phải thực hiện cả hai văn bản lỗi tùy chỉnh ** và ** kết thúc trong trình xử lý lỗi. :) – Asken

0

tôi biết là cuối trò chơi, nhưng đối với bất kỳ ai muốn một giải pháp khác, của tôi dựa trên câu trả lời của @codegeek.

tôi đã có thể để đạt được một cái gì đó tương tự với những điều sau đây trong ServerResponse.py mô-đun của tôi:

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

sau đó tôi có thể gọi

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

này giúp bạn dễ dàng trong ứng dụng AngularJS của tôi để kiểm tra một phản ứng và hiển thị thông báo mặc định hoặc tùy chỉnh X-Status-Reason thông báo mặc định hoặc tùy chỉnh

Các vấn đề liên quan