用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之入门(五)缩进和选择
May 27 Python
Python中的变量和作用域详解
Jul 13 Python
Python 的类、继承和多态详解
Jul 16 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
python自动重试第三方包retrying模块的方法
Apr 24 Python
Python实现模拟浏览器请求及会话保持操作示例
Jul 30 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
使用django和vue进行数据交互的方法步骤
Nov 11 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
使用django自带的user做外键的方法
Nov 30 Python
python 基于DDT实现数据驱动测试
Feb 18 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
Syphon 秘笈
2021/03/03 冲泡冲煮
十天学会php之第二天
2006/10/09 PHP
通俗易懂的php防注入代码
2010/04/07 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
js 处理URL实用技巧
2010/11/23 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
文明宿舍获奖感言
2014/02/07 职场文书
给小学生的新年寄语
2014/04/04 职场文书
协议书与合同的区别
2014/04/18 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
八年级物理教学反思
2016/02/19 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书