首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Flask-restless中返回“已存在”错误?

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

Stack Overflow用户
提问于 2015-04-10 03:53:02
回答 2查看 1.8K关注 0票数 6

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

我的问题是:

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

代码语言:javascript
复制
IntegrityError: (IntegrityError) column <column_name> is not unique u'INSERT INTO ...

因此,我尝试在create_api方法中添加属性validation_exceptions

代码语言:javascript
复制
manager.create_api( ... , validation_exceptions=[IntegrityError])

但是响应json包含:

代码语言:javascript
复制
{
    "validation_errors": "Could not determine specific validation errors"
} 

服务端api显示异常:

代码语言:javascript
复制
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中返回我自己的错误消息?

EN

回答 2

Stack Overflow用户

发布于 2016-02-18 01:13:32

documentation (v0.17.0到本文发布之日)声明:

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

因此,要更改validation_errors的内容,异常需要一个包含字典的errors属性。此字典的内容将在服务器响应中显示为validation_errors

来自flask-restless/tests/test_validation.py

代码语言:javascript
复制
class TestSimpleValidation(ManagerTestBase):
"""Tests for validation errors raised by the SQLAlchemy's simple built-in
validation.
For more information about this functionality, see the documentation for
:func:`sqlalchemy.orm.validates`.
"""

def setup(self):
    """Create APIs for the validated models."""
    super(TestSimpleValidation, self).setup()

    class Person(self.Base):
        __tablename__ = 'person'
        id = Column(Integer, primary_key=True)
        age = Column(Integer, nullable=False)

        @validates('age')
        def validate_age(self, key, number):
            if not 0 <= number <= 150:
                exception = CoolValidationError()
                exception.errors = dict(age='Must be between 0 and 150')
                raise exception
            return number

        @validates('articles')
        def validate_articles(self, key, article):
            if article.title is not None and len(article.title) == 0:
                exception = CoolValidationError()
                exception.errors = {'articles': 'empty title not allowed'}
                raise exception
            return article

    class Article(self.Base):
        __tablename__ = 'article'
        id = Column(Integer, primary_key=True)
        title = Column(Unicode)
        author_id = Column(Integer, ForeignKey('person.id'))
        author = relationship('Person', backref=backref('articles'))

    self.Article = Article
    self.Person = Person
    self.Base.metadata.create_all()
    self.manager.create_api(Article)
    self.manager.create_api(Person, methods=['POST', 'PATCH'],
                            validation_exceptions=[CoolValidationError])

请求:

代码语言:javascript
复制
data = dict(data=dict(type='person', age=-1))
response = self.app.post('/api/person', data=dumps(data))

响应:

代码语言:javascript
复制
HTTP/1.1 400 Bad Request

{ "validation_errors":
    {
      "age": "Must be between 0 and 150",
    }
}
票数 3
EN

Stack Overflow用户

发布于 2016-02-05 17:45:11

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

代码语言:javascript
复制
def validation_preprocessor(data, *args, **kwargs):
    # validate data by any of your cool-validation-frameworks
    if errors:
        raise ProcessingException(description='Something went wrong', code=400)

manager.create_api(
    Model,
    methods=['POST'],
    preprocessors=dict(
        POST=[validation_preprocessor]
    )
)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29547712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档