Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化Flask API的Python箭头对象_Python_Json_Serialization_Flask Restless - Fatal编程技术网

序列化Flask API的Python箭头对象

序列化Flask API的Python箭头对象,python,json,serialization,flask-restless,Python,Json,Serialization,Flask Restless,我目前正在使用Flask Untivent开发一个应用程序。当我用相应的字段替换SQLAlchemy模型的典型日期时间字段时,一切都进行得很顺利。这是由于SQLAlchemy Utils及其领域的帮助 但是,在使用API返回这些对象的JSON表示形式后,我收到了以下错误: 类型错误:箭头[2015-01-05T01:17:48.074707]不可JSON序列化 哪里是修改模型序列化方式的理想位置?我是否要修改Flask Antientive代码以支持Arrow对象,或者编写一个Flask Ant

我目前正在使用Flask Untivent开发一个应用程序。当我用相应的字段替换SQLAlchemy模型的典型日期时间字段时,一切都进行得很顺利。这是由于SQLAlchemy Utils及其领域的帮助

但是,在使用API返回这些对象的JSON表示形式后,我收到了以下错误:

类型错误:箭头[2015-01-05T01:17:48.074707]不可JSON序列化

哪里是修改模型序列化方式的理想位置?我是否要修改Flask Antientive代码以支持Arrow对象,或者编写一个Flask Antientive可以识别并用于检索JSON兼容对象的模型方法

同时我也可以编写一个丑陋的后处理器函数,但这个解决方案看起来像是一个可怕的黑客

下面是带有ArrowType字段的示例模型:

class Novel(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.Unicode, unique=True, nullable=False)
    created_at = db.Column(ArrowType, nullable=False)

    def __init__(self, title):
        self.title = title
        self.created_at = arrow.utcnow()

如何定制支持箭头类型的
JSONEncoder
?查看Flask Untivent源代码,它使用Flask内置的
jsonify
。有关以不同格式序列化常规
datetime
对象的示例,请参见此代码段:

下面是一个完整的自我包含的示例:

import flask
import flask.ext.sqlalchemy
import flask.ext.restless
from flask.json import JSONEncoder
import sqlalchemy_utils
import arrow

app = flask.Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = flask.ext.sqlalchemy.SQLAlchemy(app)

class Event(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    timestamp = db.Column(sqlalchemy_utils.ArrowType)

class ArrowJSONEncoder(JSONEncoder):
    def default(self, obj):
        try:
            if isinstance(obj, arrow.Arrow):
                return obj.format('YYYY-MM-DD HH:mm:ss ZZ')
            iterable = iter(obj)
        except TypeError:
            pass
        else:
            return list(iterable)
        return JSONEncoder.default(self, obj)

app.json_encoder = ArrowJSONEncoder

db.create_all()
manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(Event, methods=['GET','POST'])

app.run()
从您文章中的两个选项中,我建议将该方法添加到您的模型类中,以检索与JSON兼容的对象,只是因为它更简单、更易于维护。如果你想修改Flask Untivent,你要么用叉子叉它,要么用猴子修补它。

Arrow现在有了一个方法。例如:
arrow.utcnow()。For_json()