用Python编写web API的教程

 更新时间:2015年04月30日 10:10:27   作者:廖雪峰  
这篇文章主要介绍了用Python编写web API的教程,示例代码基于Python2.x版本,需要的朋友可以参考下

自从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:

相关文章

  • Django项目中包含多个应用时对url的配置方法

    Django项目中包含多个应用时对url的配置方法

    今天小编就为大家分享一篇Django项目中包含多个应用时对url的配置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 在Python中处理XML的教程

    在Python中处理XML的教程

    这篇文章主要介绍了在Python中处理XML的教程,是Python网络编程中的基础知识,需要的朋友可以参考下
    2015-04-04
  • Python-VTK隐式函数属性选择和剪切数据

    Python-VTK隐式函数属性选择和剪切数据

    这篇文章主要介绍了Python-VTK隐式函数属性选择和剪切数据,VTK,是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化,下面文章主题相关详细内容需要的小伙伴可以参考一下
    2022-04-04
  • 关于matlab图像滤波详解(二维傅里叶滤波)

    关于matlab图像滤波详解(二维傅里叶滤波)

    这篇文章主要介绍了关于matlab图像滤波详解(二维傅里叶滤波),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Flask 使用类组织配置详情

    Flask 使用类组织配置详情

    这篇文章主要介绍了Flask使用类组织配置,在实际的项目中,我们一般都会建立三个环境:开发、测试和生产环境,这三种环境会使用不同的配置组合,为了能方便地切换配置,我们可以为不同的环境创建不同的配置文件,下面来看详细内容,需要的朋友可以参考一下
    2021-11-11
  • django2笔记之路由path语法的实现

    django2笔记之路由path语法的实现

    这篇文章主要介绍了django2笔记之路由path语法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python在不同目录下导入模块的实现方法

    Python在不同目录下导入模块的实现方法

    下面小编就为大家带来一篇Python在不同目录下导入模块的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • python基于搜索引擎实现文章查重功能

    python基于搜索引擎实现文章查重功能

    这篇文章主要介绍了python基于搜索引擎实现文章查重功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Python多线程与多处理之间的区别详解

    Python多线程与多处理之间的区别详解

    在本文中,我们将学习 Python 中多线程和多处理的内容、原因和方式,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • python比较2个xml内容的方法

    python比较2个xml内容的方法

    这篇文章主要介绍了python比较2个xml内容的方法,涉及Python操作XML文件的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论