如何在Flask-restless中返回“已存在”错误?

时间:2015-04-09 19:53:02

标签: python validation exception-handling flask-sqlalchemy flask-restless

我想为异常做一些处理程序。我在python中使用了Flask-restless和SQLAlchemy的组合。

我的问题:

当我使用DB中已存在的对象向api发送请求时,SQLAlchemy显示异常:

IntegrityError: (IntegrityError) column <column_name> is not unique u'INSERT INTO ...

所以我尝试将属性validation_exceptions添加到create_api方法中:

manager.create_api( ... , validation_exceptions=[IntegrityError])

但是响应json包含:

{
    "validation_errors": "Could not determine specific validation errors"
} 

和服务器api显示异常:

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\flask_restless\views.py", line 797, in _extract_error_messages
    left, right = str(exception).rsplit(':', 1)
ValueError: need more than 1 value to unpack

Flask-restless中的异常验证不适用于此类异常(IntegrityError)

我该怎么办?是否可以为异常创建一些处理程序并在json中返回我自己的错误消息?

2 个答案:

答案 0 :(得分:3)

documentation(截至本发布日期为v0.17.0)声明:

  

目前,Flask-Restless期望指定验证错误的实例将具有errors属性,该属性是字段映射字段名称到错误描述(注意:每个字段一个错误)。

因此,要更改 $(document).ready( function() { $('#list li').click(function() { $("#mytextarea").insertAtCaret($(this).text()); return false }); }); $.fn.insertAtCaret = function (myValue) { return this.each(function(){ //IE support if (document.selection) { this.focus(); sel = document.selection.createRange(); sel.text = myValue; this.focus(); } //MOZILLA / NETSCAPE support else if (this.selectionStart || this.selectionStart == '0') { var startPos = this.selectionStart; var endPos = this.selectionEnd; var scrollTop = this.scrollTop; this.value = this.value.substring(0, startPos)+ myValue+ this.value.substring(endPos,this.value.length); this.focus(); this.selectionStart = startPos + myValue.length; this.selectionEnd = startPos + myValue.length; this.scrollTop = scrollTop; } else { this.value += myValue; this.focus(); } }); };的内容,您的异常需要包含字典的 #sidediv li{cursor:pointer;}属性。此词典的内容将在服务器响应中显示为 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="sidediv"> <ul id="list"> <li>Client first name</li> <li>lastname</li> <li>username</li> </ul> </div> <textarea name="mytextarea" id="mytextarea" cols="70" rows="10">Hello!</textarea>

来自flask-restless/tests/test_validation.py

validation_errors

请求:

errors

响应:

validation_errors

答案 1 :(得分:0)

您可以使用预处理器来捕获验证错误。

Error: PARSE ERROR: Encountered "traceonly" at line 1, column 15...

但我不确定这是一个很好的方法。