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. TinkerPop中的遍历:图的遍历步骤(3/3)

    48 Project Step project() 步骤(map)将当前对象投射到由提供的标签键入的Map<String,Object>中. gremlin> g.V().out(' ...

  2. 公司内部Wiki及搭建wiki系统-confluence

    Wiki 是一个协同著作平台或称开放编辑系统.我们可以用Wiki来建设帮助系统,知识库系统.国内公共wiki最著名就是百度百科.那公司内部为什么要使用wiki呢? 2.内部wiki的作用 1.鼓励分享 ...

  3. iOS开发进制转换

    1.十进制转换为二进制 /** 十进制转换为二进制 @param decimal 十进制数 @return 二进制数 */ + (NSString *)getBinaryByDecimal:(NSIn ...

  4. 如何在页面中使用svg图标

    1.svg图标长啥样 注意:图标的宽高无所谓,使用时可以根据需求修改,fill后面是颜色的填充,可修改图标颜色. <svg viewBox="0 0 1024 1024" v ...

  5. kuangbin专题16D(next求最小循环节)

    题目链接: https://vjudge.net/contest/70325#problem/D 题意: 给出一个循环字符串, 可以在两端添加任意字符, 问最少添加多少字符可以使循环字符串变成周期循环 ...

  6. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre

    原文链接:https://blog.csdn.net/hq091117/article/details/79065199 https://blog.csdn.net/allen_tsang/artic ...

  7. (Python OpenGL)【1】你好顶点 PyOpenGL

    原文链接(C语言环境)(Python OpenGL) 我用python实现的代码: __author__ = "WSX" from OpenGL.GLUT.freeglut imp ...

  8. shell操作字符串案例

    #!/bin/bash name="Shell" url="http://cxy.com/" str1=$name$url #中间不能有空格 str2=&quo ...

  9. mybatis主键返回语句 使用方法,就是实体类.getid即可拿到返回的id

    <insert id="insertSelective" parameterType="com.o2o.Content" useGeneratedKeys ...

  10. java 实现导出Excel文件

    java 实现导出Excel(java生成 excel 并导出文件) 经常有有一些数据需要导出成   excel  格式 ,所以就需要实现啦 开始: 1.加入jar poi-3.6-20091214. ...