OpenStack Restful API框架介绍

时间:2022-03-28 20:34:08

1  pecan框架介绍

1.1  什么是pecan

pecan是一个轻量级的python web框架,最主要的特点是提供了简单的配置即可创建一个wsgi对象并提供了基于对象的路由方式。

主要提供的功能点:

(1)基于对象的路由分发

(2)支持restful接口方式

(3)可拓展的安全框架

(4)可拓展的模板语言支持

(5)可拓展的json支持

(6)简单的python配置

1.2  安装部署

为了不影响原有环境我们使用virtualenv工具创建一个隔离的python环境来做实验

$ virtualenv pecan-env $ cd pecan-env $ source bin/activate

安装pecan:

$ pip install pecan

我的实验环境是pecan 1.3.3的,可以用pecan --version命令查看

创建一个pecan项目:

$ pecan create pecan_test_project

tree命令查看下生成的项目文件结构:

OpenStack Restful API框架介绍

可以根据自己的需要筛减些,比如我只想要用pecan来帮我实现restful接口,那么public、templates等目录是可以去除掉的

这里介绍几个常用的文件或目录:

pecan_test_project/controllers:这个目录是用来存放要路由的对象类和要调用的对象方法的

pecan_test_project/model:用来存放模型的,比如一个数据库表的model,做ORM映射时会用到

pecan_test_project/tests:可以用来写一些单元测试

pecan_test_project/app.py:该文件用来控制如何构建你的pecan应用,该文件里会包含setup_app函数用来生成和返回一个wsgi app,一般来说,该文件是不用再修改的

config.py:该文件定义了服务的ip和端口号、服务的根目录类等和日志设置等。

直接执行pecan serve config.py命令服务就开始跑起来了

默认监听IP是0.0.0.0,端口号是8080

然后直接在页面访问,比如我的服务器是192.168.0.107,则浏览器访问:8080就会看到如下页面了

OpenStack Restful API框架介绍

这是因为我们访问的是它的根路径,根据pecan的基于对象的分发,它对调用如下的index方法,返回一个index.html页面了(这个index方法是被默认为当get请求分发到这个对象时会被路由到该方法,它其实是包裹在了expose里,可以理解它为get方法):

OpenStack Restful API框架介绍

1.3  安装部署pecan的对象分发路由策略

Pecan的根路径是通过配置文件中指定的某个类开始的,比如上面的RootController类,并且会把请求路径按/分成多份,比如/test1/test2/test3,则会从RootController找test1对象,再从test1对象中找test2对象,再从test2对象中找test3对象,最后调用test3类对象的方法。

举个例子:

修改root.py文件为:

from pecan import expose, redirect from webob.exc import status_map class BooksController(object): @expose() def index(self): return "Welcome to book section." @expose() def bestsellers(self): return "We have 5 books in the top 10." class CatalogController(object): @expose() def index(self): return "Welcome to the catalog." books = BooksController() class RootController(object): @expose(generic=True, template=index.html) def index(self): return dict() @index.when(method=POST) def index_post(self, q): redirect(https://pecan.readthedocs.io/en/latest/search.html?q=%s % q) @expose(error.html) def error(self, status): try: status = int(status) except ValueError: # pragma: no cover status = 500 message = getattr(status_map.get(status), explanation, ‘‘) return dict(status=status, message=message) catalog = CatalogController()

则如下几个url就会对象如下几个方法:

:8080/catalog  --> CatalogController类index方法

:8080/catalog/books/bestsellers -->  BooksController类bestsellers方法