用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 相关文章推荐
phpsir 开发 一个检测百度关键字网站排名的python 程序
Sep 17 Python
整理Python中的赋值运算符
May 13 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
Python实现的科学计算器功能示例
Aug 04 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
详细分析python3的reduce函数
Dec 05 Python
python 删除非空文件夹的实例
Apr 26 Python
Python二次规划和线性规划使用实例
Dec 09 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
Python select及selectors模块概念用法详解
Jun 22 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
Jun 03 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
php将时间差转换为字符串提示
2011/09/07 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
javascript中this指向详解
2016/04/23 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
基于anaconda下强大的conda命令介绍
2018/06/11 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
会计专业毕业生自我评价
2013/09/25 职场文书
大学生写自荐信的技巧
2014/01/08 职场文书
校本教研工作方案
2014/01/14 职场文书
民生工程实施方案
2014/03/22 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技