Pecan Introduce

  Pecan是一个轻量级的基于Python的Web框架,

  Pecan的目标并不是要成为一个“full stack”的框架,

  因此Pecan本身不支持类似Session和Databases.

Pecan Features

  (1) Object-dispatch for easy routing

  (2) Full support for REST-style controllers

  除了上述功能外,还包括以下扩展功能:

  Extensible security framework

  Extensible template language support

  Extensible JSON support

  Easy Python-based configuration

Pecan Web Application Files Structure

├── MANIFEST.in
├── config.py
├── public
│ ├── css
│ │ └── style.css
│ └── images
├── setup.cfg
├── setup.py
└── test_project
├── __init__.py
├── app.py
├── controllers
│ ├── __init__.py
│ └── root.py
├── model
│ └── __init__.py
├── templates
│ ├── error.html
│ ├── index.html
│ └── layout.html
└── tests
├── __init__.py
├── config.py
├── test_functional.py
└── test_units.py

  以上是一个默认的Pecan Web应用文件包结构。

  (1) config.py是整个应用的配置入口.

  (2) public文件夹存放Web应用所需的Image,CSS或者Javascript.

  (3) setup.py和setup.cfg用于Web应用的安装部署.

  (4) controllers存放路由控制文件.

  (5) templates存储Html或者Json的模板文件.

  (6) tests存放测试用例.

  PS:

    在测试环境可以使用pecan serve config.py启动Web应用.

    在商用环境下可以部署Pecan的Web应用到Apache等Web服务器.

Object-dispatch for easy routing

  以下是一个简单是Web应用示例,示例中Pecan通过修饰器公开接口。

  这个示例是使用Pecan开发一个具体的Web应用。

from pecan import expose,request, redirect, response
from webob.exc import status_map class BooksController(object):
@expose(content_type='text/plain')
def index(self):
return "Welcome to book section." @expose(content_type='text/plain')
def bestsellers(self):
return "We have 5 books in the top 10." class CatalogController(object):
@expose(content_type='text/plain')
def index(self):
return "Welcome to the catalog." #books
books = BooksController() class RootController(object):

   # 默认页面以index.html为模板
@expose(generic=True, template='index.html')
def index(self):
return dict() # for POST
@index.when(method='POST')
def index_post_test(self, q):
redirect('http://pecan.readthedocs.org/en/latest/search.html?q=%s' % q)

   # show error page
@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) # /hello
@expose(generic=True, template='index.html')
def hello(self):
return dict() # /testtext.txt
@expose(content_type='text/plain')
def testtext(self):
return 'text test' # json
@expose('json')
def jsontest(self):
response.status = 200
return {'foo': 'bar'} # catalog
catalog = CatalogController()

Full support for REST-style controllers

以下是一个使用Pecan实现的Rest服务.

包括GET,POST,PUT,DELETE.

from pecan import abort, expose

# Note: this is *not* thread-safe.  In real life, use a persistent data store.
BOOKS = {
'': 'The Last of the Mohicans',
'': 'Catch-22'
} class BookController(object): def __init__(self, id_):
self.id_ = id_
assert self.book @property
def book(self):
if self.id_ in BOOKS:
return dict(id=self.id_, name=BOOKS[self.id_])
abort(404) # HTTP GET /<id>/
@expose(generic=True, template='json')
def index(self):
return self.book # HTTP PUT /<id>/
@index.when(method='PUT', template='json')
def index_PUT(self, **kw):
BOOKS[self.id_] = kw['name']
return self.book # HTTP DELETE /<id>/
@index.when(method='DELETE', template='json')
def index_DELETE(self):
del BOOKS[self.id_]
return dict() class RootRestController(object): @expose()
def _lookup(self, id_, *remainder):
return BookController(id_), remainder # HTTP GET /
@expose(generic=True, template='json')
def index(self):
return [dict(id=k, name=v) for k, v in BOOKS.items()] # HTTP POST /
@index.when(method='POST', template='json')
def index_POST(self, **kw):
id_ = len(BOOKS)
BOOKS[id_] = kw['name']
return dict(id=id_, name=kw['name'])

WSGI学习系列Pecan的更多相关文章

  1. WSGI学习系列WebOb

    1. WSGI Server <-----> WSGI Middleware<-----> WSGI Application  1.1 WSGI Server wsgi ser ...

  2. WSGI学习系列Paste

    Paste has been under development for a while, and has lots of code in it. The code is largely decoup ...

  3. WSGI学习系列WSME

    Introduction Web Services Made Easy (WSME) simplifies the writing of REST web services by providing ...

  4. WSGI学习系列多种方式创建WebServer

    def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) ...

  5. WSGI学习系列eventlet.wsgi

    WSGI是Web Service Gateway Interface的缩写. WSGI标准在PEP(Python Enhancement Proposal)中定义并被许多框架实现,其中包括现广泛使用的 ...

  6. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

  7. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  8. WCF学习系列汇总

    最近在学习WCF,打算把一整个系列的文章都”写“出来,包括理论和实践,这里的“写”是翻译,是国外的大牛写好的,我只是搬运工外加翻译.翻译的不好,大家请指正,谢谢了.如果觉得不错的话,也可以给我点赞,这 ...

  9. EF(Entity Framework)系统学习系列

    好久没写博客了,继续开启霸屏模式,好了,废话不多说,这次准备重新系统学一下EF,一个偶然的机会找到了一个学习EF的网站(http://www.entityframeworktutorial.net/) ...

随机推荐

  1. Unknown storage engine 'InnoDB'

    报错情况:在导入数据时候发现找不到InnoDB这个错误,之前查看博客时候明白了IsAsm数据库和InnoDB这两个的区别了. 解决方案: 尝试一:将my.ini配置文件的isasm改成InnoDB.这 ...

  2. WebGoat系列实验Denial of Service & Insecure Communication

    WebGoat系列实验Denial of Service & Insecure Communication ZipBomb 服务器仅接收ZIP文件,将上传的文件解压,进行操作之后删除.已知服务 ...

  3. enum枚举型

    在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等. 以每周七天为例, ...

  4. 整理的C#屏幕截图,控件截图程序

    代码基本从网上搜集而来,整理成以下文件: 包括屏幕截图(和屏幕上看到的一致): 以及控件截图(只要该控件在本窗口内显示完全且不被其他控件遮挡就可正确截图) using System; using Sy ...

  5. 正经学C#_布尔运算[布尔值与其布尔运算符]:《c#入门经典》

    前面几个章节简述了 C#中得常用得算术运算符.这一章节说布尔值与其布尔运算符. 布尔值在c#中表示方式是 bool类型,这个类型可以储存两个值,true或者false,或者真或者假,可以说0或者1. ...

  6. git commit失败

    1.使用命令  git rm test.txt 删除版本库中文件, 下一步:git commit 提交 出现如图: 这是因为没有同时提交信息,即:git commit -m "这里是信息&q ...

  7. POJ - 2528Mayor's posters (离散化+线段树区间覆盖)

    The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...

  8. 使用原生js来操作对象dom的class属性

    之前一直都使用jquery来操作dom,今天想自己用原生写一些插件,却发现给dom增删class的时候,使用slice来截取className特别的麻烦,后来发现,原来原生JS本来就有提供api来对d ...

  9. anglarJs分页

    首先在页面引入分页插件 <script src="../plugins/angularjs/pagination.js"></script> <lin ...

  10. HashMap 1.8的源码分析一

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, ...