用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基于Tkinter的HelloWorld入门实例
Jun 17 Python
Python简单实现子网掩码转换的方法
Apr 13 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
Python中将dataframe转换为字典的实例
Apr 13 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
Django REST framework 分页的实现代码
Jun 19 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
大数据分析用java还是Python
Jul 06 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
Python selenium的这三种等待方式一定要会!
Jun 10 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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代码
2008/09/10 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
javascript制作2048游戏
2015/03/30 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
在Django框架中编写Context处理器的方法
2015/07/20 Python
python方向键控制上下左右代码
2018/01/20 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
团组织关系介绍信
2014/01/12 职场文书
经济管理专业求职信
2014/06/09 职场文书
2015年电工工作总结
2015/04/10 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
环保建议书范文
2015/09/14 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python