` decorest'library提供了一个易于使用的声明性rest api客户机接口,在这个接口中,使用decorators定义的api方法会自动给出一个工作的rest客户机,而不需要额外的代码。

decorest的Python项目详细描述


decorest - decorator heavy REST client for Python
#################################################

.. 图片::https://img.shields.io/travis/bkryza/decorest.svg
:目标:https://travis ci.org/bkryza/decorest

…图像::https://img.shields.io/pypi/v/decorest.svg
:目标:https://pypi.python.org/pypi/decorest

…图像::https://img.shields.io/pypi/l/decorest.svg
:目标:https://pypi.python.org/pypi/decorest

…图片::https://img.shields.io/pypi/pyversions/decorest.svg
:目标:https://pypi.python.org/pypi/decorest


python的声明性、基于装饰的rest客户端。

……角色::py(代码)
:语言:python



…内容:

概述
=


decorest_u库提供了一个易于使用的声明性rest api客户端接口,
在该接口中,使用decorators定义api方法会自动生成一个工作的rest客户端,而不需要额外的代码。实际上,库只提供了一个描述rest服务并与之交互的接口,实际工作由请求库在下面完成。代码块::python


reed_name):
"列出所有子品种"



打印(client.list_子品种('hound')




安装
====


代码块::bash



用法
==


基础
----


>对于大多数典型情况,用法应该相当简单。只需创建py:`decorest.restclient`的
子类并定义方法,这些方法将执行对实际rest服务的调用。您可以使用附加到
方法定义的decorators声明每个函数应该如何执行
对服务的请求。方法本身不需要任何实现,
除了docstring之外。

api客户机类定义完成后,只需创建一个实例,就可以了。此库依赖于请求库提供的功能,这意味着任何有效的命名参数(可以传递给请求)http调用也可以传递给客户端方法的调用,并按原样转发。"examples"中的示例客户机。


decorators
----


下面是所有受支持的decorators的列表以及简短的说明和
示例。有些decorator可以同时附加到客户端类和
方法,在这种情况下,类级decorator将应用于该类中的所有http方法
。此外,每个decorator都可以在方法调用期间直接重写,方法是提供一个名为decorator的命名参数s具有特定http方法的请求以及作为参数提供的相对于
端点的路径。路径可以包含括在大括号中的变量,例如:

。代码块::python

@get('breed/{breed_name}/list')
def list_子品种(self,breed_name):
"列出所有子品种"

r/>~~~~~~~

将查询参数添加到请求中。url编码将应用于
值,使用:py:`urlencode`,例如:

。代码块::python

@get('breed/{breed戋name}/list')
@query('long戋names','longnames')
@query('limit')
def list戋u子品种(self,breed戋name,long戋names,limit=100):
"列出所有子品种"


方法参数的名称
,其值将被添加为相同名称的查询参数值


而不是方法参数名)。


此外,如果在方法声明中提供了默认值,则在调用过程中未提供此参数的值时,将使用该值。

例如,对上述方法的以下调用:

。代码块::python



将导致以下查询:

…代码块:

https://dog.ceo/api/breed/hound?longnames=1&;limit=100

此装饰符只能添加到方法中。

@form
~~~~~

例如:

…代码块::python

@post('breed')
@form('breed_name')
@form('breed_url','breed_wikipedia_link')
def add_breed(self,breed_name,breed_url):
"add sub breed"

终止方法参数的名称
,该方法参数的值将被添加为相同名称的查询参数值



如果提供了两个参数,则第二个参数将确定实际的
表单字段名称,该名称将在请求表单中使用(如果由于某种原因
它不能与方法参数名相同)。

/>向请求添加头密钥-值对,例如:

…代码块::python

@get('breed/{breed_name}/list')
@header('accept','application/json')
def list_子品种(self,breed_name):
"列出所有子品种"

类级
修饰符将被添加到每个方法中,并可以使用方法
级修饰符重写。

@body
~~~


body修饰符允许指定哪些方法参数应为请求提供
正文内容,例如:

。代码块::python

@post('pet')
@header('content-type','application/json')
@header('accept','application/json')
@body('pet')
def add_pet(self,pet):
"向商店添加新宠物"

:py:`@body'装饰器可以使用可选参数提供序列化
处理程序的ent,在将参数作为
正文内容传递之前,该处理程序将自动调用,正文内容可以是简单的lambda或具有某些
逻辑的更复杂的函数。例如:

…代码块::python

@post('pet')
@header('content-type','application/json')
@header('accept','application/json')
@body('pet',lambda p:json.dumps(p))
def add_pet(self,pet):
"将新的pet添加到存储中"


使用:py:`json.dumps()`函数对作为"pet"参数值提供的字典进行omamaly stringify。

@on
~~


>默认情况下,request方法不会返回requests\response对象,
,但响应将取决于响应的内容类型。

e http请求成功,预期结果如下:

-:py:`response.json()`如果响应的内容类型为json
-:py:`response.content`如果内容类型为binary
-:py:`response.text`否则

如果请求失败,则调用:py:`response.raise_for_status()',并在代码中处理


如果需要其他行为,则可以为使用lambdas或函数的每个方法。提供的处理程序预计只接受一个参数,即请求响应对象,例如:

。代码块::python

@get('breed/{breed戋name}/list')
@header('accept','application/json')
@on(200,lambda r:r.json())
def list戋u子品种(self,breed戋name):
"列出所有子品种"

类将为接收
提供的状态代码的方法调用处理程序。

此装饰符的第一个参数必须是整数。在python 3上,还可以传递:py:`…`(即省略号)对象,它等价于
到:py:`httpstatus.any`。传递给此参数的任何其他值都将引发:py:`typeerror`.

@content
~~~~~~~~~~~
此装饰符是:py:`@header(`content-type',…)`,例如:

代码块::python

@post('pet')
@content('application/json')
@header('accept','application/json')
@body('pet',lambda p:json.dumps(p))
def add_pet(self,pet):
"向商店添加新宠物"

@accept
~例如:

…代码块::python

@get('breed/{breed戋name}/list')
@content('application/json')
@accept('application/xml')
def list戋u子品种(self,breed戋name):
"列出所有子品种"

@endpoint
~/>然后不必在客户端构造函数中提供:

…代码块::python

@endpoint('https://dog.ceo/api')
class dog client(restclient):
"列出所有子品种"
def初始化(self,endpoint=none):
super(dogclient,self)。\uinit初始化(endpoint)

owever.


@timeout
~~~~~~~~~~
指定方法或整个api的默认超时值(以秒为单位)。

代码块::python

@endpoint('https://dog.ceo/api')
@timeout(5)
class dogclient(restclient):
"列出所有子品种"
@def初始(self,endpoint=none):
super(dogclient,self)。\uu初始(endpoint)

@stream
~指定返回二进制数据流的方法。
将此装饰器添加到方法将向请求调用添加一个:py:`stream=true`
参数,并在默认情况下返回整个请求
对象,然后可以使用例如:py:`iter\u content()`方法访问该对象。

。代码块::python




class myclient(restclient):



@get('stream/{n}/{m}')
@stream
@query('size')
@query('offset','off')
def stream(self,n,m,size,offset):
"get data range"




EAM(2,4,1024,200)作为R:对于R.iter_内容中的B(块大小=100):
content.append(b)




会话
--


基于请求库以
会话对象的形式提供的功能,会话可以显著提高
客户端的性能,以防出现多个响应执行并维护证书在
请求之间的信息中,例如会话cookie。


可以手动创建和关闭decorest中的会话:

。代码块::python

s.list\u subbries('hound')
s.list\u subbries('husky')
s.u close()


代码块::python

基本客户机
类。

如果需要对会话进行一些额外的自定义,则可以使用:py:``请求会话'属性:

代码块::python

特定于rest api的实际调用,
而不是它的规范,没有用于身份验证的decorator,
,而是可以在客户端对象中使用
:py:``u set``u auth()`方法设置身份验证对象(与'requests`
身份验证机制兼容),例如示例:

…代码块::python

client.\u set_auth(httpbasicauth('user','password')
with client.\u session()为s:
s.\u requests_session.verify='/path/to/cert.pem'
s.list_subbries('hound')
s.list_subbries('husky')

authenti阳离子对象将在两个常规的API调用中使用,也将在使用会话时使用。




在代码中。

客户端示例`.



注意事项
----


~~~~~~~~~~~~~~~~~~


>除http方法
decorator(例如:py:`@get()`)之外,decorator基本上可以按任何顺序添加,该方法应始终位于给定的
decorator列表的顶部。应该在http方法
decorators之上添加第三方decorators。

字典。如果这是一个问题,则decorest修饰符应与完整的
模块命名空间一起使用:

…代码块::python

@decorest.post('pet')
@decorest.content('application/json')
@decorest.header('accept','application/json')
@decorest.body('pet',lambda p:json.dumps(p))
def add_pet(self,pet):
"将新宠物添加到商店"


与其他装饰程序的兼容性
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一般来说,应该在http方法decorators之上添加第三方decorators
,因为只有http decorators
发出实际的http请求。因此,试图包装实际调用的典型decorators应该得到http方法decorators返回的http可调用函数,例如:py:`@get()`。

目前,无法添加dec演说者,如:py:`@classmethod`
或:py:`@staticmethod`到api方法,因为调用需要客户端类的实例



license
==



版权所有2018 bartosz kryza<;bkryza@gmail.com>;


");
除非符合许可证,否则您不得使用此文件。
您可以在http://www.apache.org/licenses/license-2.0

在"按原样"的基础上,
没有任何形式的保证或条件,无论是明示的还是默示的。
请参阅许可证,了解管辖许可的特定语言和许可证下的限制。




_测试:https://github.com/bkryza/decorest/tree/master/tests
…_请求:https://github.com/requests/requests
…_`请求会话`:http://docs.python requests.org/en/master/user/advanced/会话对象
…_装饰:https://github.com/bkryza/decorest
…_`描述符对象`:https://docs.python.org/3/c-api/descriptor.html
。_` petstore swagger客户端示例`:https://github.com/bkryza/decorest/blob/master/examples/swagger_petstore/petstore_client.py

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

推荐PyPI第三方库


热门话题
java如何将cassandra中的行数据转换为与列相关的嵌套json   java如何使用jcr XPath在jcr:content/@jcr:data中搜索?   java在使用openCV进行安卓开发时如何利用手机的广角镜头   java解析扩展了接口,结束了一个潜在的无限循环   位置服务的@Override方法中存在java Android应用程序错误   java本地线程的用途和需求是什么   具有左右子访问的java节点树遍历   java验证JsonWebToken签名   JUL日志处理程序中的java日志记录   嵌入式Java读取给定时间段的串行数据。   java有没有办法从多个URL获取多个图像?   java线程通过等待intent阻止自己发送intent   java Spring MVC解析多部分内容请求   java JPA/Hibernate静态元模型属性未填充NullPointerException   java格式错误的字符(需要引号,得到I)~正在处理   java为什么PrintWriter对象抛出FileNotFoundException?   java Neo4j未正确保存标签   java IE不加载图像