烧瓶的json api工具

flask-jsontools-slippers的Python项目详细描述


Build Status

烧瓶jsontools

Flask的JSON API工具

目录

  • 查看实用程序
    • @jsonapi
      • jsonresponse
      • 生成JSON响应()
  • 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>;``返回这些对象。

参数:

方法:

  • 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 methodHTTP methodURL
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',))

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
带truezip的java拆分zip   java Spring,AppEngine:在AppEngine的数据源中添加postgresql url   java Android coverflow   java以编程方式创建复合过滤器,以在log4j 2中定义多个过滤器   java jpa eclipselink异常[eclipselink 4002]   中的java WordNet数据库目录相对路径。罐子   java无法在Spring Boot 2/3中显示登录的用户   java Onetomany:未找到联接表错误   java数据模型演化   java方法在类型列表中添加的(对象)不适用于参数(int)意味着什么?   用java打印两个数组   java SNMP4J发送从不超时   java添加/删除联系人(EditText)+类别(SpinnerBox),可以根据需要动态添加/删除多个联系人   语句和PreparedStatement之间的java差异   java在运行作为JAR归档文件分发的项目时加载图像等资源   来自应用程序或外部服务器的java Cron作业   多线程Java并发:并发添加和清除列表项   java更改单元测试的私有方法行为