用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 相关文章推荐
详细介绍Ruby中的正则表达式
Apr 10 Python
Python虚拟环境Virtualenv使用教程
May 18 Python
python自带的http模块详解
Nov 06 Python
SQLite3中文编码 Python的实现
Jan 11 Python
python通过pip更新所有已安装的包实现方法
May 19 Python
Python内置模块logging用法实例分析
Feb 12 Python
python 2.7.14安装图文教程
Apr 08 Python
python的pip安装以及使用教程
Sep 18 Python
Python安装pycurl失败的解决方法
Oct 15 Python
python实现动态创建类的方法分析
Jun 25 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
django跳转页面传参的实现
Sep 17 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的中问验证码
2006/11/25 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
python通过wxPython打开一个音频文件并播放的方法
2015/03/25 Python
python实现基本进制转换的方法
2015/07/11 Python
Python3如何解决字符编码问题详解
2017/04/23 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
python如何实现int函数的方法示例
2018/02/19 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
HTML5使用DOM进行自定义控制示例代码
2013/06/08 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
党支部特色活动方案
2014/08/20 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
信息技术教研组工作总结
2015/08/13 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL