内容简介:Flask RESTful API 开发----基础篇 (1)
0. 前言
接下来一段时间,Gevin将开一个系列专题,讲Flask RESTful API的开发,本文是第1篇《Flask RESTful 基础》,本系列文章列表如下:
- 基础篇(1) --- Flask RESTful 基础
- To Be Continued...
1. RESTful 简介
我在博文《RESTful 架构风格概述》和《RESTful API 编写指南》中曾详细论述过我对RESTful的理解,以及规范的RESTful API开发需要涉及的内容,本节摘录几条重点内容,为下文做铺垫:
- RESTful 是面向资源的,每个资源至少有一个url与之对应
- 统一数据交互接口,即通过http的
GET
,POST
,PUT
(orPATCH
), 和DELETE
进行资源的获取、创建、更新和删除 - 资源(数据)以文本形式在网络上传输,通常以json或xml格式为载体
- 无状态(以后讲认证时再展开论述)
2. Flask 对RESTful 架构风格的支持
Flask RESTful 开发相关的库很多,我也收集过一些(collection在此,不定期更新),其实,与Django不同, Flask原生对RESTful的支持已经做的很好 ,不借助这些extension,一样可以开发出足够好的RESTful API,而且没有这些extension的束缚,我们可以在开发过程中,配合使用Flask生态中处理相应问题最好的extension,或者我们自己最上手的extension,这也更加符合Flask的philosophy。Gevin在Flask RESTful 开发中,不使用各类flask rest扩展的主要原因,正是每个扩展都有不尽如意之处。
那么,我们就来看一下Flask原生是如何支持RESTful开发的。
2.1 Flask对HTTP方法的支持
Flask原生支持所有的HTTP方法,如RESTful API中最常用的 GET
, POST
, PUT
, PATCH
和 DELETE
,这些不需赘述解释,直接上代码即可:
@app.route('/http-method-test/', methods=['GET', 'POST', 'PUT', 'PATCH', 'DELETE']) def http_method_example(): if request.method == 'GET': return 'Send request with `GET` method' elif request.method == 'POST': return 'Send request with `POST` method' elif request.method == 'PUT': return 'Send request with `PUT` method' elif request.method == 'PATCH': return 'Send request with `PATCH` method' elif request.method == 'DELETE': return 'Send request with `DELETE` method'
另外一种方式是采用Flask的 MethodView
:
class HttpMethodExample(MethodView): def get(self): return 'Send request with `GET` method' def post(self): return 'Send request with `POST` method' def put(self): return 'Send request with `PUT` method' def patch(self): return 'Send request with `PATCH` method' def delete(self): return 'Send request with `DELETE` method' app.add_url_rule('/http-method-test2/', view_func=HttpMethodExample.as_view('http_method_example2'))
2.2 Flask 对序列化与反序列化的支持
RESTful 开发时,数据的载体通常为 json
或 xml
格式的文本,随着RESTful的不断发展, json
更是成为了RESTful API 数据的主流载体。而Flask本身,已经对json的支持已经非常好了。
2.2.1 序列化
RESTful API开发中的序列化,通过包含了以下操作:
- 将Python native格式的数据(如dict和list)转换为文本数据(如json或xml)
- 将文本数据作为请求的response返回给客户端,response的http header里要同时附加
application/json
这个mimetype
这两步操作,Flask提供的一个快捷函数 jsonify()
能直接完成,其详情正如下面的 Flask官方文档 所述:
This function wraps dumps() to add a few enhancements that make life easier. It turns the JSON output into a Response object with the application/json mimetype. For convenience, it also converts multiple arguments into an array or multiple keyword arguments into a dict. This means that both jsonify(1,2,3) and jsonify([1,2,3]) serialize to [1,2,3].
很简单的事情,不该说这么多,直接上代码示例吧:
class SerializationExample(MethodView): def get(self): option = request.args.get('option') if option == 'list1': return self.test_list() if option == 'list2': return self.test_list2() if option == 'dict1': return self.test_dict1() if option == 'dict2': return self.test_dict2() if option == 'dict3': return self.test_dict3() msg = { 'info': '`option` is needed in url as a url parameter', 'avilable option values': 'list1, list2, test_dict1, test_dict2, test_dict2' } return jsonify(msg) def test_list(self): data = [{'a':1, 'b':2}, {'c':3, 'd':4}] return jsonify(result=data) def test_list2(self): data = [1,2,3,4,5,6,7,8] return jsonify(data) def test_dict1(self): data = {'a':1, 'b':2, 'c':3} return jsonify(data) def test_dict2(self): data = {'a':1, 'b':2, 'c':3} return jsonify(**data) def test_dict3(self): data = {'a':1, 'b':2, 'c':3} return jsonify(result=data) app.add_url_rule('/serialization/', view_func=SerializationExample.as_view('serialization'))
上面代码的重点即,那几个以 test_
开头的函数,序列化的表现形式无外乎这几种。
2.2.2 反序列化
反序列化,即把文本形式的数据转换为Python native类型数据的过程。在RESTful API开发时,Flask内置的 get_json()
方法,能够把request中的json数据,转换为 Python 标准库中的dict或list。
Parses the incoming JSON request data and returns it. By default this function will return None if the mimetype is not application/json
, but this can be overridden by the force parameter.
If parsing fails the on_json_loading_failed()
method on the request object will be invoked.
示例代码:
@app.route('/deserialization/', methods=['get', 'post']) def deserialization(): if request.method == 'POST': data = request.get_json() if not data: return 'No json data found', 400 result = { 'json data in request': data } return jsonify(result) return 'Please post json data'
注:
Flask原生的序列化和反序列化方法,都是针对目前RESTful API 开发时最流行的json格式的,且只能做 json
与 dict
或 list
的相互转换,如果想序列化或反序列化对象实例,需要借助其他方法,这个会在以后的文章中做进一步解释。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- springmvc教程--注解开发基础详解
- C++开发EOS基础指南
- flume 1.8.0 开发基础
- 移动端开发基础知识扫盲
- 业务开发转基础开发,这三种 “高可用” 架构你会么?
- Python开发【第二章】入门基础
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web2.0策略指南
艾米 / 2009-3 / 39.00元
《Web2.0策略指南》是有关战略的。书中的示例关注的是Web 2.0的效率,而不是聚焦于技术。你将了解到这样一个事实:创建Web 210业务或将Web 2.0战略整合到现在业务中,意味着创建一个吸引人们前来访问的在线站点,让人们愿意到这里来共享他们的思想、见闻和行动。当人们通过Web走到一起时,结果可能远远大于各部分的和。随着传统的“口碑传诵”助推站点高速成长,客户本身就能够帮助建立站点。 ......一起来看看 《Web2.0策略指南》 这本书的介绍吧!