Document for SingePage
GitHub
SingePage 是一个基于flask的python RESTful 框架
源代码很简单,容易修改与扩展
使用简单,提供GeneralView,完全不用管json部分
框架目前主要类,描述列表如下:
类名 | 用途 |
---|---|
url | 给View注册url |
SinglePage | 基于flask.view,提供请求分发,结果序列化功能 |
GeneralViewWithSQLAlchemy | 基于SinglePage类的通用视图函数,能和SQLAlchemy配合快速实现接口 |
permission | 用于视图访问权限管理,可用来实现业务逻辑 |
快速开始
与flask常用的基于方法的视图不同,SinglePage的常规用法是基于类
# coding: utf-8
from SinglePage import app, SinglePage
from base import Base, db_session
from sqlalchemy import Column, Integer, String, Text, Boolean, Float, DateTime, Enum
class Address(SinglePage, Base):
pass
以上代码片段,从SinglePage导入flask实例,SinglePage类,导入数据库相关
我们的Address类继承至SinglePage,同时继承了来自SQLAlchemy的Base,这样这个类同时是视图和ORM
当然目前这份代码没有任何作用,我们继续完善它,首先定义字段
# coding: utf-8
from SinglePage import *
from SinglePage import app
from base import Base, db_session
from sqlalchemy import Column, Integer, String, Text, Boolean, Float, DateTime, Enum
class Address(SinglePage, Base):
# 定义表字段
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
address = Column(String(15))
新增的代码定义了表名字,主键id,address
既然这是一个RESTful框架,那么应该能够方便的响应HTTP动词,事实上在SinglePage内部实现了请求分发,不同动词的请求会由不同的方法来响应,目前支持,PUT,GET,POST,DELETE ,四种常用的方法,他们会分别由同名但是小写的方法来响应,代码如下。
# coding: utf-8
from SinglePage import *
from SinglePage import app
from base import Base, db_session
from sqlalchemy import Column, Integer, String, Text, Boolean, Float, DateTime, Enum
class Address(SinglePage, Base):
# 定义数据表
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
address = Column(String(15))
# 处理http get方法
def get(self):
return db_session.query(self.object).all(), 'sqlalchemy'
# 处理http post方法
def post(self):
# 获取request的json并新建一个用户
data = request.get_json()
address = self.object(data)
db_session.add(address)
db_session.commit()
return 'ok', 'basic'
以上代码处理了GET和POST方法,当对应的请求到来时会分别由get(),post()来响应
其中get方法会把数据库中所有address表记录返回,post方法会新增一条记录
你可能注意到了,return语句很奇怪。
return db_session.query(self.object).all(), 'sqlalchemy'
return 'ok', 'basic'
第一条语句返回了查询队列和字符串‘sqlalchemy’,第二条队列返回了字符串’ok‘和字符串’basic‘
事实上SinglePage处理了动词响应方法的返回,它会将这些返回进行序列化和JSON化,由于序列化器实现的原因,必须指明带序列对象的类型,目前支持的序列化对象包括sqlalchemy的普通类,他们对应使用’sqlalchemy’和’basic’来注明,字符串,数据包装类都属于‘basic’,当然,我知道,这很不优雅。
第二个让人遗憾的地方应该是self.object,它指向类自身,注意self.object得到的不是类实例而是类本身。
所以以下代码:
data = request.get_json()
address = self.object(data)
获取来自请求中的j