用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判断两个对象相等的原理
Dec 12 Python
ubuntu17.4下为python和python3装上pip的方法
Jun 12 Python
Python判断一个文件夹内哪些文件是图片的实例
Dec 07 Python
python+opencv实现阈值分割
Dec 26 Python
关于python多重赋值的小问题
Apr 17 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
python tkinter canvas使用实例
Nov 04 Python
Python中的 ansible 动态Inventory 脚本
Jan 19 Python
python3格式化字符串 f-string的高级用法(推荐)
Mar 04 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
Apr 26 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 Python
Flask处理Web表单的实现方法
Jan 31 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循环table实现一行两列显示的方法
2015/06/04 PHP
微信支付开发发货通知实例
2016/07/12 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
非常漂亮的相册集 使用jquery制作相册集
2016/04/28 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
理解 javascript 中的函数表达式与函数声明
2017/07/07 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
python访问sqlserver示例
2014/02/10 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
python 穷举指定长度的密码例子
2020/04/02 Python
Python脚本调试工具安装过程
2021/01/11 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
电子商务专业自我鉴定
2013/12/18 职场文书
公司企业表扬信
2014/01/11 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
运动会报道稿大全
2015/07/23 职场文书
Redis实现分布式锁的五种方法详解
2022/06/14 Redis