sqlalchemy REST 序列化
我在看sqlalchemy的文档时,看到有关于序列化的部分。
我在想,是否可以使用xml序列化器来让sqlalchemy模型和像Jax-RS这样的Rest网络服务匹配。
有一个django的扩展可以处理这个问题:django_roa
你知道是否已经为sqlalchemy开发过类似的东西,或者这样做是否可能呢?
谢谢
2 个回答
1
sqlalchemy.ext.serializer
是用来支持将查询、表达式和其他一些 SQLAlchemy 内部对象进行“打包”的,打包是指使用 pickle
模块把这些对象转换成可以存储或传输的格式。不过,它并不处理模型对象。所以,它并不能帮助你把模型对象转换成 XML 格式。如果你想要这样的功能,可能可以试试 pyxser 这个工具。
2
要完全符合RFC2616标准还有很长的路要走,不过对于一个原型来说,我会这样做:
from sqlalchemy import create_engine, Table, Column, Integer, String, ForeignKey, UniqueConstraint
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, backref, sessionmaker
from sqlalchemy.sql.expression import desc
import web
import json
DB_PATH = 'sqlite:////tmp/test.db'
Base = declarative_base()
class LocalClient(Base):
__tablename__ = 'local_clients'
__jsonexport__ = ['id', 'name', 'password']
id = Column(Integer, primary_key=True)
name = Column(String, unique=True, nullable=False)
password = Column(String)
def __init__(self, name, password):
self.name = name
self.password = password
def __repr__(self):
return "<LocalClient('%s', '%s')>" % (self.name, self.password)
urls = (
'/a/LocalClient', 'LocalClientsController'
)
class Encoder(json.JSONEncoder):
'''This class contains the JSON serializer function for user defined types'''
def default(self, obj):
'''This function uses the __jsonexport__ list of relevant attributes to serialize the objects that inherits Base'''
if isinstance(obj, Base):
return dict(zip(obj.__jsonexport__, [getattr(obj, v) for v in obj.__jsonexport__]))
return json.JSONEncoder.default(self, obj)
class LocalClientsController:
'''The generic RESTful Local Clients Controller'''
def GET(self):
'''Returns a JSON list of LocalClients'''
engine = create_engine(DB_PATH, echo=False)
Session = sessionmaker(bind=engine)
session = Session()
clis = session.query(LocalClient)
return json.dumps([c for c in clis], cls=Encoder)