烧瓶的json api工具

flask-jsontools的Python项目详细描述


Build StatusPythons

烧瓶jsontools

Flask的JSON API工具

目录

查看实用程序

@索纳皮

修饰一个表示json的视图函数。

这样的函数可以返回:

  • (response, status[, headers])的元组:设置自定义状态代码和可选的-header
  • ^{}
  • 的实例
  • helper函数的结果^{}

示例:

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

扩展^{}并用JSON编码响应。 用^{}修饰的视图返回这些对象。

参数:

  • response:响应数据
  • status:状态代码。可选,默认为200
  • headers:附加标题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是一个令人头疼的问题:如果实例上存在属性,这并不意味着 它是从数据库中加载的。

^ }是一个混合的SqLalChany声明基,添加了一个神奇的^ {< CD18>}方法,与 ^{}。序列化时,它确保实体序列化将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>'))

静止视图

由于MethodView主要用于在实体集合上公开api,因此有一个restful助手 自动用@methodview修饰某些特殊方法。

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

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

推荐PyPI第三方库


热门话题
java Cassandra复制因子大于节点数   java J2EE JTA事务回滚不适用于OSE Glassfish 4.0(Build 89)   java spring安全预认证用户登录   org的java类文件。反应流。从RxJava编译示例时未找到Publisher?   java在使用dataFormat作为POJO通过Camel调用Web服务时无法设置SOAP标头   Javafx类的java静态实例   java如何防止一个部件在关闭时覆盖另一个部件的位置   sql server无法从我的java代码连接到数据库   java在JList(Swing)中显示带有的ArrayList   从Java中的CXF服务获取WSAddressing数据   使用资产文件夹进行java简单json解析(本地)   java LDAPException未绑定的无效凭据   JavaJSFspring部署到weblogic   JAVA中字符数组中的特定元素排列?   如果脚本位于不同的目录中,则ant不会使用exec标记运行Javashell脚本