用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中关于中文编码问题的处理建议
Apr 08 Python
python 把数据 json格式输出的实例代码
Oct 31 Python
对python pandas读取剪贴板内容的方法详解
Jan 24 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
Jan 23 Python
PyTorch笔记之scatter()函数的使用
Feb 12 Python
Python如何在DataFrame增加数值
Feb 14 Python
Python-openCV开运算实例
Jul 05 Python
pycharm 2020 1.1的安装流程
Sep 29 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 Python
python 基于wx实现音乐播放
Nov 24 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里的JS打印函数
2006/10/09 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
js函数调用的方式
2014/05/06 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
Python实现Const详解
2015/01/27 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
Python批量查询域名是否被注册过
2017/06/21 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
django的settings中设置中文支持的实现
2019/04/28 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
在python3中实现更新界面
2020/02/21 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
Python字节单位转换(将字节转换为K M G T)
2021/03/02 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
采购员岗位职责
2013/11/15 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
夏季奶茶店创业计划书
2014/01/16 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle