长颈长颈瓶

flask-restful-hal的Python项目详细描述


简介

flask restful halFlask-RESTful。它 添加对生成HAL APIs的支持。

安装

最新版本可从pypi获得:

pipinstallflask-restful-hal

用法

flask restful hal扩展了 酒瓶安稳。与其定义一个get方法,不如定义一个data方法 必须实现,它返回资源类的内容。在 添加两个可选方法embeddedlinks可以是 定义以描述嵌入并链接到 当前资源。这三种方法都可以定义为staticmethod 如果方法调用之间不需要共享数据(请参见 section about data sharing了解更多 信息)。

最小资源类

的示例
fromflaskimportFlaskfromflask_restful_halimportApi,ResourceTODOS={'todo1':{'task':'build an API'},'todo2':{'task':'?????'},'todo3':{'task':'profit!'},}classTodo(Resource):@staticmethoddefdata(todo):returnTODOS[todo]app=Flask(__name__)api=Api(app)api.add_resource(Todo,'/todos/<todo>')app.run()

在本例中,实现了唯一需要的方法data,并且 将请求的todo条目作为python字典返回。默认情况下, 这个字典被解析为一个json字符串并在http中返回 内容类型为application/hal+json的响应。如果蟒蛇 包json2html已安装,客户端可以请求HTML 作为替代输出(通过发送Accept: text/html)。

当请求资源时,客户端可以添加查询字符串 links=true获取链接的资源。因为没有links方法是 实现时,只有默认的self链接将包含在 回应。

具有嵌入和链接资源的资源类的示例

fromflaskimportFlaskfromflask_restful_halimportApi,Embedded,Link,ResourceTODOS={'todo1':{'task':'build an API'},'todo2':{'task':'?????'},'todo3':{'task':'profit!'},}classTodo(Resource):@staticmethoddefdata(todo):returnTODOS[todo]@staticmethoddeflinks(todo):returnLink('collection','/todos')classTodoList(Resource):@staticmethoddefdata():return{'size':len(TODOS)}@staticmethoddefembedded():arguments_list=[(todo,)fortodoinsorted(TODOS.keys())]returnEmbedded('items',Todo,*arguments_list)@staticmethoddeflinks():arguments_list=[('/todos/{}'.format(todo),{'title':todo})fortodoinsorted(TODOS.keys())]returnLink('items',*arguments_list)app=Flask(__name__)api=Api(app)api.add_resource(TodoList,'/todos')api.add_resource(Todo,'/todos/<todo>')app.run()
  1. 可以通过从返回一个或多个Link对象来添加链接 静态links例程。Link构造函数接受 关系(例如collectionupitem)和一个或 多个链接目标。链接目标可以表示为 字符串(Href属性)或由A Href字符串和 有额外属性的字典。在示例中使用title。 作为额外的属性。
  2. 嵌入资源用一个或多个^{tt21}表示$ 物体。同样,第一个参数是一个关系。第二次 参数是嵌入的资源类,以下参数 是具有该类的构造函数参数的元组。

默认情况下,不嵌入任何资源。嵌入资源可以是 使用查询字符串embed=true请求,该字符串影响所有 资源递归(嵌入的资源也可以嵌入资源)。 可以通过指定嵌入的具体级别来更改此行为 (例如,embed=2只嵌入两级资源)。

方法间共享数据

在大多数情况下,dataembeddedlinks方法需要 访问同一数据源。为了避免访问数据 后端(例如数据库)三次使用类似的查询 可以定义forthpre_hal方法,该方法在每个^{tt28}上调用$ 执行dataembeddedlinks之前的请求。在 pre_hal您可以访问数据后端并将结果缓存到 当前资源对象的实例变量。

classTodoList(Resource):defpre_hal(self,embed,include_links,todo):self.todos=db.query(...)defdata(self):return{'size':len(self.todos)}defembedded(self):arguments_list=[(todo,)fortodoinsorted(self.todos.keys())]returnEmbedded('items',Todo,*arguments_list)deflinks(self):arguments_list=[('/todos/{}'.format(todo),{'title':todo})fortodoinsorted(self.todos.keys())]returnLink('items',*arguments_list)

保护api端点

flask restful hal不包括任何授权机制 保护您的api端点。但是,您可以很容易地集成可用的 通过重写Resource类来扩展烧瓶。以下 示例使用 Flask-JWT-Extended 使用json web令牌保护GET请求。生成标记 通过使用basic auth保护的特殊端点/auth_token

fromflaskimportFlask,gfromflask_httpauthimportHTTPBasicAuthfromflask_jwt_extendedimportcreate_access_token,jwt_requiredfromflask_restfulimportResourceasRestResourcefromflask_restful_halimportApi,Embedded,Link,ResourceasHalResourceTODOS={'todo1':{'task':'build an API'},'todo2':{'task':'?????'},'todo3':{'task':'profit!'},}http_basic_auth=HTTPBasicAuth()@http_basic_auth.verify_passworddefverify_password(username,password):g.username=username# TODO: implement some check here...returnTrueclassSecuredHalResource(HalResource):@jwt_requireddefget(self,**kwargs):returnsuper().get(**kwargs)classAuthToken(RestResource):@http_basic_auth.login_requireddefget(self):auth_token=create_access_token(identity=g.username)returnjsonify({'auth_token':auth_token})classTodo(SecuredHalResource):@staticmethoddefdata(todo):returnTODOS[todo]app=Flask(__name__)app.config['JWT_SECRET_KEY']='use your super secret key here!'api=Api(app)api.add_resource(AuthToken,'/auth_token')api.add_resource(Todo,'/todos/<todo>')app.run()

使用/auth_token终结点请求的令牌可用于 使用bearer方案访问的http授权头 安全资源:

Authorization: Bearer <token>

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

推荐PyPI第三方库


热门话题
字典java cassandra对象映射注释   java定制Solr TokenFilter lemmatizer   字符串从Java文件中读取windows文件名   java如何在Windows上设置StanfordCorenlp服务器以返回文本   java axis2“意外的子元素值”   java使用POI HSSF获取错误   多线程Java等待计时器线程完成   java ForkJoinPool BuffereImage处理风格   从java代码运行Python脚本   java将字节[]转换为短[],使每个短元素包含13位数据   java如何为swing jframe应用程序将代码划分为类   java使用okhttp更改baseurl   java AlertDialog。建设者setView导致堆栈溢出错误   java如何在特定的radius 安卓 studio中接收地址列表?