用Python编写web API的教程


Posted in Python onApril 30, 2015

自从Roy Fielding博士在2000年他的博士论文中提出REST(Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。

什么是Web API呢?

如果我们想要获取一篇Blog,输入http://localhost:9000/blog/123,就可以看到id为123的Blog页面,但这个结果是HTML页面,它同时混合包含了Blog的数据和Blog的展示两个部分。对于用户来说,阅读起来没有问题,但是,如果机器读取,就很难从HTML中解析出Blog的数据。

如果一个URL返回的不是HTML,而是机器能直接解析的数据,这个URL就可以看成是一个Web API。比如,读取http://localhost:9000/api/blogs/123,如果能直接返回Blog的数据,那么机器就可以直接读取。

REST就是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,以JSON格式编写的REST风格的API具有简单、易读、易用的特点。

编写API有什么好处呢?由于API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代码编写更简单。

一个API也是一个URL的处理函数,我们希望能直接通过一个@api来把函数变成JSON格式的REST API,这样,获取注册用户可以用一个API实现如下:

@api
@get('/api/users')
def api_get_users():
  users = User.find_by('order by created_at desc')
  # 把用户的口令隐藏掉:
  for u in users:
    u.password = '******'
  return dict(users=users)

所以,@api这个decorator只要编写好了,就可以把任意的URL处理函数变成API调用。

新建一个apis.py,编写@api负责把函数的返回结果序列化为JSON:

def api(func):
  @functools.wraps(func)
  def _wrapper(*args, **kw):
    try:
      r = json.dumps(func(*args, **kw))
    except APIError, e:
      r = json.dumps(dict(error=e.error, data=e.data, message=e.message))
    except Exception, e:
      r = json.dumps(dict(error='internalerror', data=e.__class__.__name__, message=e.message))
    ctx.response.content_type = 'application/json'
    return r
  return _wrapper

@api需要对Error进行处理。我们定义一个APIError,这种Error是指API调用时发生了逻辑错误(比如用户不存在),其他的Error视为Bug,返回的错误代码为internalerror。

客户端调用API时,必须通过错误代码来区分API调用是否成功。错误代码是用来告诉调用者出错的原因。很多API用一个整数表示错误码,这种方式很难维护错误码,客户端拿到错误码还需要查表得知错误信息。更好的方式是用字符串表示错误代码,不需要看文档也能猜到错误原因。

可以在浏览器直接测试API,例如,输入http://localhost:9000/api/users,就可以看到返回的JSON:

Python 相关文章推荐
Python中List.index()方法的使用教程
May 20 Python
Python3基于sax解析xml操作示例
May 22 Python
Pandas 同元素多列去重的实例
Jul 03 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
Python文件循环写入行时防止覆盖的解决方法
Nov 09 Python
Python对excel文档的操作方法详解
Dec 10 Python
Python 一句话生成字母表的方法
Jan 02 Python
Python元组知识点总结
Feb 18 Python
python应用文件读取与登录注册功能
Sep 23 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 Python
python神经网络 使用Keras构建RNN训练
May 04 Python
为Python的web框架编写前端模版的教程
Apr 30 #Python
为Python的web框架编写MVC配置来使其运行的教程
Apr 30 #Python
在Python的web框架中配置app的教程
Apr 30 #Python
python实现从ftp服务器下载文件的方法
Apr 30 #Python
简单介绍Python下自己编写web框架的一些要点
Apr 29 #Python
编写Python的web框架中的Model的教程
Apr 29 #Python
python获取本地计算机名字的方法
Apr 29 #Python
You might like
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
学习jquery之一
2007/04/27 Javascript
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
vue实现设置载入动画和初始化页面动画效果
2019/10/28 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
2020/03/17 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
浅谈python中的占位符
2017/11/09 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
linux面试题参考答案(3)
2012/09/13 面试题
Ruby如何进行文件操作
2014/07/17 面试题
求职简历推荐信范文
2013/12/02 职场文书
小学新学期教师寄语
2014/01/18 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
群众路线表态发言材料
2014/10/17 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python