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. C++面试笔记--树

    树 树的题目基本都是二叉树,但是面试官还没有说是不是二叉树的时候千万不要先把答案说出来,要是面试官说是多叉树,而你做的是二叉树就直接挂了! 一. 树的三种遍历.前序.中序.后序,如果直接考遍历,就肯定 ...

  2. 《Effective Java》第11章 序列化

    "将一个对象编码成一个字节流",称作将该对象序列化(serializing); 相反的处理过程被称作反序列化(deserializing),一旦对象被序列化后,它的编码就可以从一台 ...

  3. C#中控制线程池的执行顺序

    在使用线程池时,当用线程池执行多个任务时,由于执行的任务时间过长,会导制两个任务互相执行,如果两个任务具有一定的操作顺序,可能会导制不同的操作结果,这时,就要将线程池按顺序操作.下面先给一段代码,该代 ...

  4. winform ComBox绑定数据

    初始化数据: List<KeyValuePair<string, string>> list: ComBox1.ValueMember = "Key";Co ...

  5. C++日志模块实现的经验之谈

    以类的方式对日志模块进行封装,可创建一个单实例的接口或创建一个全局的日志对象指针,同时提供相应的对外写日志接口. 写日志的接口采用可变参数来建立,可使用va_list类型和##args参数,同时在写日 ...

  6. c++内联 inline

    内联声明只是建议 ,不一定就会内联. http://www.voidcn.com/blog/u011327981/article/p-5006835.html

  7. CloudStack网络概念

    转载:http://www.300wl.com/news/2016/0203/206663.html CloudStack网络模式分为简单网络(Basic Networking)和高级网络(Advan ...

  8. sort排序bug乱序

    项目需要对组件的zIndex值进行降序排列,刚开始采用的是sort进行排序,排完之后感觉没问题,毕竟也是经常用的,可是昨天无意中把zIndex值打出来看,一看不知道,发现只要排序的组件超过10个就出问 ...

  9. 大众点评CAT开源监控系统剖析

    参考文档: 大众点评的实时监控系统分析(一) CAT_source_analyze 透过CAT,来看分布式实时监控系统的设计与实现 深度剖析开源分布式监控CAT [分布式监控CAT] Client端源 ...

  10. 【图灵学院10】高并发之java线程池源码分析

    1. 提纲 1)线程池的模块结构 2)示例&原理解析 2. 问题 1)线程池包含哪些东西 2)线程池的运作原理 3)调度线程池的运作原理 4)线程池怎么实现FixRate,FixDelay,他 ...