使用python和flask将日期对象写入riak(具有过于复杂的jsonification)

时间:2013-01-22 17:47:17

标签: python json date flask riak

我一直在为自己做一个小项目,我使用riak,python和flask框架。就像在大多数情况下一样,我想存储我在riak中存储的对象的创建日期,以及其他一些日期(如会话到期日期)。当我第一次尝试存储日期对象时,我发现了一个错误,解决方案就是使用这样的代码:

def date(obj):
    return obj.isoformat() if hasattr(obj, 'isoformat') else obj


def json_date():
    return json.dumps(datetime.now(), default=date)

我已经对它进行了测试,并愉快地使用了它,但后来我已经遇到了一些更为复杂的需求,即从现在起N分钟内的会话到期日期,所以我很快写了这样的东西:

def json_session_expiration_date():
    return json.dumps(datetime.now() + timedelta(minutes=15), default=date)

既然我的应用程序的核心工作,我想清理愚蠢和次优的代码,在我开始编写更多功能之前,我有一个问题就是这三个功能 - 我不明白目的是什么日期(obj)函数,因此我不能轻易地将它们全部合并到一个函数中。任何建议表示赞赏!

2 个答案:

答案 0 :(得分:1)

date函数用作dumps functiondefault函数;对于JSON不知道如何处理的任何类型,都会调用该函数。

JSON标准只知道数字,字符串,布尔值,空值(python中的None),对象(python中的dicts)和列表。如果你想处理那些有限类型之外的任何东西,你需要表达一些'某些东西'就这些类型而言。

default()用于此目的;它被调用为任何无法按原样序列化为JSON的对象。 datetime对象就是这样一种类型。当datetime对象转到json.dumps()时,系统会要求default函数创建一个可序列化的版本。

请注意,返回obj并不是处理您不知道如何转换的类型的正确方法。改为TypeError

def date(obj):
    try:
        return obj.isoformat()
    except AttributeError:
        raise TypeError()

答案 1 :(得分:1)

使用date.isoformat()将返回ISO8601格式的日期字符串,这是处理Riak中日期的方法。然后可以在map / reduce期间将日期字符串转换回javascript中的Date对象,或者在reduce阶段将其简单地排序为字符串。

如果您使用的是json.dumps()的默认参数,那么您应该遵循Martijn Pieters示例并在对象没有TypeError属性时提出isoformat() - 只有DateDateTime个对象将有。