烧瓶的json api工具
flask-jsontools-slippers的Python项目详细描述
烧瓶jsontools
Flask的JSON API工具
目录
- 查看实用程序
- @jsonapi
- jsonresponse
- 生成JSON响应()
- @jsonapi
- Flaskjsonclient
- 基于类的视图
- 方法视图
- restfulview
查看实用程序
@jsonapi
修饰一个表示json的视图函数。
这样的函数可以返回:
- (response, status[, headers]):的元组设置自定义状态 代码和可选-标题
- `JsonResponse<;jsonresponse>;` 的实例
- helper函数的结果 `make_json_response<;使_json_response>;`
示例:
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
延伸 `flask.Request<;http://flask.pocoo.org/docs/api/#incoming-request-data>;。`_ 并用json编码响应。装饰有 `@jsonapi<;jsonapi>;``返回这些对象。
参数:
- response:响应数据
- status:状态代码。可选,默认为200
- headers:附加标题dict。可选。
- **kwargs:的其他参数 `Response<;http://flask.pocoo.org/docs/api/#response-objects>;`\uu
方法:
- 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响应()
实际将视图返回值预处理为 `JsonResponse<;jsonresponse>;``。
接受rv作为以下任一项:
- (response, status[, headers]) 元组
- 对象编码为json
Flaskjsonclient
flaskjsonclient是一个json感知的测试客户机:它可以发布json并解析 json响应到`JsonResponse<;jsonresponse>;`。
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中,对自定义类的对象进行编码的事实标准是 返回 反对。
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(DynamicJSONEncoder,self).default(o)
现在,只需将编码器安装到烧瓶:
fromflaskimportFlaskapp=Flask(__name__)app.json_encoder=DynamicJSONEncoder
jsonserializablebase
将sqlalchemy模型序列化为json是一个令人头疼的问题:如果属性是 出现在实例上,这并不意味着它是从 数据库。
^ t2121}$是SqLalChany声明性基的混合函数 添加一个神奇的__json__()方法,与 `DynamicJSONEncoder<;动态传感器编码器>;`。序列化时,它 确保实体序列化将never发出附加的 请求。
示例:
fromsqlalchemy.ext.declarativeimportdeclarative_basefromflask.ext.jsontoolsimportJsonSerializableBaseBase=declarative_base(cls=(JsonSerializableBase,))classUser(Base):#...
现在,您可以在json视图中安全地使用sqlalchemy模型进行响应, jsontools将处理剩下的:)
基于类的视图
模块flask.ext.jsontools.views包含两个类 允许生成基于类的视图,这些视图将分派到不同的方法。
与 MethodView, 这提供了更高的灵活性。
方法视图
对方法使用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)
现在,GEThttp方法被路由到两个不同的方法,具体取决于 条件。继续定义更多方法以获得良好的路由:)
为了简化创建视图的最后一步,有一个助手:
UserView.route_as_view(app,'user',('/user/','/user/<int:user_id>'))
restfulview
因为MethodView对于在 实体中,有一个restful帮助器,它自动装饰一些 使用@methodview的特殊方法。
View method | HTTP method | URL |
---|---|---|
list() | GET | ^{tt33}$ |
create() | POST | ^{tt33}$ |
get() | GET | ^{tt35}$ |
replace() | PUT | ^{tt35}$ |
update() | POST | ^{tt35}$ |
delete() | DELETE | ^{tt35}$ |
通过子类化RestfulView并实现其中一些方法, 您将得到一个完整的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',))。