长颈长颈瓶
flask-restful-hal的Python项目详细描述
简介
flask restful hal是 Flask-RESTful。它 添加对生成HAL APIs的支持。
安装
最新版本可从pypi获得:
pipinstallflask-restful-hal
用法
flask restful hal扩展了 酒瓶安稳。与其定义一个get方法,不如定义一个data方法 必须实现,它返回资源类的内容。在 添加两个可选方法embedded和links可以是 定义以描述嵌入并链接到 当前资源。这三种方法都可以定义为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()
- 可以通过从返回一个或多个Link对象来添加链接 静态links例程。Link构造函数接受 关系(例如collection、up或item)和一个或 多个链接目标。链接目标可以表示为 字符串(Href属性)或由A Href字符串和 有额外属性的字典。在示例中使用title。 作为额外的属性。
- 嵌入资源用一个或多个^{tt21}表示$ 物体。同样,第一个参数是一个关系。第二次 参数是嵌入的资源类,以下参数 是具有该类的构造函数参数的元组。
默认情况下,不嵌入任何资源。嵌入资源可以是 使用查询字符串embed=true请求,该字符串影响所有 资源递归(嵌入的资源也可以嵌入资源)。 可以通过指定嵌入的具体级别来更改此行为 (例如,embed=2只嵌入两级资源)。
保护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>