烧瓶的json api工具
flask-jsontools的Python项目详细描述
烧瓶jsontools
Flask的JSON API工具
目录
查看实用程序
@索纳皮
修饰一个表示json的视图函数。
这样的函数可以返回:
示例:
fromflask.ext.jsontoolsimportjsonapi@app.route('/users')@jsonapideflist_users():return[{'id':1,'login':'kolypto'},#...]@app.route('/user/<int:id>',methods=['DELETE'])defdelete_user(id):return{'error':'Access denied'},403
jsonresponse
扩展^{
参数:
response
:响应数据status
:状态代码。可选,默认为200headers
:附加标题dict.可选。**kwargs
:附加参数用于^{}
方法:
preprocess_response_data(response)
:重写以获取自定义响应行为。get_json()
:获取原始响应数据__getitem__(key)
:从响应数据中获取项
额外的方法允许重用视图:
fromflask.ext.jsontoolsimportjsonapi@app.route('/user',methods=['GET'])@jsonapideflist_users():return[{1:'first',2:'second'}]@app.route('/user/<int:id>',methods=['GET'])@jsonapidefget_user(id):returnlist_users().get_json()[id]# Long formreturnlist_users()[id]# Shortcut
生成json响应()
实际将视图返回值预处理到^{
接受rv
作为以下任一项:
(response, status[, headers])
元组
- 对象编码为json
Flaskjsonclient
flaskjsonclient是一个支持json的测试客户机:它可以发布json并将json响应解析为^{
frommyapplicationimportApplicationfromflask.ext.jsontoolsimportFlaskJsonClientdefJsonTest(unittest.TestCase):defsetUp(self):self.app=Application(__name__)self.app.test_client_class=FlaskJsonClientdeftestCreateUser(self):withself.app.test_client()asc:rv=c.post('/user/',json={'name':'kolypto'})# rv is JsonResponserv.status_coderv.get_json()['user']# Long form for the previousrv['user']# Shortcut for the previous
格式化实用程序
动态传感器编码器
在python中,编码自定义类对象的事实标准是__json__()
方法,它返回
对象的表示。
DynamicJSONEncoder
是这个协议的实现:如果一个对象有__json__()
方法,那么它的结果如果用于
代表。
您肯定希望将其子类化以支持其他类型,例如日期和时间:
fromflask.ext.jsontoolsimportDynamicJSONEncoderclassApiJSONEncoder(DynamicJSONEncoder):defdefault(self,o):# Custom formatsifisinstance(o,datetime.datetime):returno.isoformat(' ')ifisinstance(o,datetime.date):returno.isoformat()ifisinstance(o,set):returnlist(o)# Fallbackreturnsuper(ApiJSONEncoder,self).default(o)
现在,将编码器安装到烧瓶上:
fromflaskimportFlaskapp=Flask(__name__)app.json_encoder=DynamicJSONEncoder
jsonserializablebase
将sqlalchemy模型序列化为json是一个令人头疼的问题:如果实例上存在属性,这并不意味着 它是从数据库中加载的。
^
示例:
fromsqlalchemy.ext.declarativeimportdeclarative_basefromflask.ext.jsontoolsimportJsonSerializableBaseBase=declarative_base(cls=(JsonSerializableBase,))classUser(Base):#...
现在,您可以在json视图中安全地使用sqlalchemy模型进行响应,jsontools将处理其余部分:)
基于类的视图
模块flask.ext.jsontools.views
包含两个允许构建基于类的视图的类
它们以不同的方式发送。
方法视图
对方法使用MethodView
类,用@methodview()
来修饰它们,它接受以下参数:
methods=()
:可用于此方法的http方法。ifnset=None
:条件匹配。应该设置not的路由参数名称列表,以便此方法匹配。ifset=None
:条件匹配。应为此方法设置以匹配的路由参数名称的列表。
这允许将http方法映射到类方法,此外还可以定义各个方法应在何时匹配。
快速示例:
fromflask.ext.jsontoolsimportjsonapi,MethodView,methodviewclassUserView(MethodView):# Canonical way to specify decorators for class-based viewsdecorators=(jsonapi,)@methodviewdeflist(self):""" List users """returndb.query(User).all()@methodviewdefget(self,user_id):""" Load a user by id """returndb.query(User).get(user_id)userview=CrudView.as_view('user')app.add_url_rule('/user/',view_func=userview)app.add_url_rule('/user/<int:user_id>',view_func=userview)
现在,GET
http方法根据条件被路由到两个不同的方法。
继续定义更多方法以获得良好的路由:)
为了简化创建视图的最后一步,有一个助手:
UserView.route_as_view(app,'user',('/user/','/user/<int:user_id>'))
静止视图
由于MethodView
主要用于在实体集合上公开api,因此有一个restful助手
自动用@methodview
修饰某些特殊方法。
View method | HTTP method | URL |
---|---|---|
list() | GET | ^{ |
create() | POST | ^{ |
get() | GET | ^{ |
replace() | PUT | ^{ |
update() | POST | ^{ |
delete() | DELETE | ^{ |
通过子类化RestfulView
和imp有了这些方法,
您将得到一个完整的api端点和一个类。
还需要通过定义primary_key
属性来定义主键字段列表:
fromflask.ext.jsontoolsimportjsonapi,RestfulViewclassUser(RestfulView):decorators=(jsonapi,)primary_key=('id',)#region Operation on the collectiondeflist():returndb.query(User).all()defcreate():db.save(user)returnuser#endregion#region Operation on entitiesdefget(id):returndb.query(User).get(id)defreplace(id):db.save(user,id)defupdate(id):db.save(user)defdelete(id):db.delete(user)#endregion
当这样的类被定义时,它的元类会遍历这些方法并用@methodview
装饰它们。
这样,list()
得到@methodview('GET', ifnset=('id',))
,而get()
得到@methodview('GET', ifset=('id',))
。