分类: Python/Ruby
2010-12-16 14:05:54
不过,在Python 世界,仅仅针对互联网应用的专门框架,就有不下20种!以至有人专门研究:"为何有如此多的Python Web实用框架?"
{{{脚注: 访问地址:http://xlp223.yculblog.com/post.1634226.html 精巧地址: }}}
原文出处:
{{{脚注: 访问地址: 精巧地址: }}} 在此文章中,Joe Gregorio 为了展示任何人可以通过Python快速创建自个儿的Web应用框架,当场使用 8个文件(6个Python脚本,一个页面模板文件,一个服务器脚本)创建并运行了一个含有足够功能的应用框架! 以些来回答了为何有如此多的Python Web实用框架?:
因为,实现一个忒简单了! 接下来,允许笔者将此框架整体展示一下:
model.py ~ 数据库设计模板脚本
from sqlalchemy import Table, Column, String
import dbconfig
entry_table = Table('entry', dbconfig.metadata,
Column('id', String(100), primary_key=True),
Column('title', String(100)),
Column('content', String(30000)),
Column('updated', String(20), index=True)
)
dbconfig.py ~ 数据库连接配置脚本
from sqlalchemy import *
metadata = BoundMetaData('sqlite:///tutorial.db')
manage.py ~ 服务管理脚本
import os, sys
def create():
from sqlalchemy import Table
import model
for (name, table) in vars(model).iteritems():
if isinstance(table, Table):
table.create()
def run():
'''使用WSGI模式启动服务
'''
import urls
if os.environ.get("REQUEST_METHOD", ""):
from wsgiref.handlers import BaseCGIHandler
BaseCGIHandler(sys.stdin, sys.stdout, sys.stderr, os.environ).run(urls.urls)
else:
from wsgiref.simple_server import WSGIServer, WSGIRequestHandler
httpd = WSGIServer(('', 8080), WSGIRequestHandler)
httpd.set_app(urls.urls)
print "Serving HTTP on %s port %s ..." % httpd.socket.getsockname()
httpd.serve_forever()
if __name__ == "__main__":
if 'create' in sys.argv:
create()
if 'run' in sys.argv:
run()
main.cgi ~ 服务器运行脚本
import manage manage.run()
urls.py ~ 基于URL的对象选择器
import selector
import view
urls = selector.Selector()
urls.add('/blog/', GET=view.list)
urls.add('/blog/{id}/', GET=view.member_get)
urls.add('/blog/;create_form', POST=view.create, GET=view.list)
urls.add('/blog/{id}/;edit_form', GET=view.member_get, POST=view.member_update)
view.py ~ 基于WSGI应用的多个视图
import robaccia
import model
def list(environ, start_response):
rows = model.entry_table.select().execute()
return robaccia.render(start_response, 'list.html', locals())
def member_get(environ, start_response):
id = environ['selector.vars']['id']
row = model.entry_table.select(model.entry_table.c.id==id).execute().fetchone()
return robaccia.render(start_response, 'entry.html', locals())
def create(environ, start_response):
pass
def create_form(environ, start_response):
pass
def member_edit_form(environ, start_response):
pass
def member_update(environ, start_response):
pass
robaccia.py ~ 模板处置脚本
import kid
import os
extensions = {
'html': 'text/html',
'atom': 'application/atom+xml'
}
def render(start_response, template_file, vars):
ext = template_file.rsplit(".")
contenttype = "text/html"
if len(ext) > 1 and (ext[1] in extensions):
contenttype = extensions[ext[1]]
template = kid.Template(file=os.path.join('templates', template_file), **vars)
body = template.serialize(encoding='utf-8')
start_response("200 OK", [('Content-Type', contenttype)])
return [body]
list.html ~ 页面应用模板
A Robaccia Blog
创建数据库
~$ python manage.py create
通过交互环境,初始化数据
~$ python Python 2.4.3 (#2, Apr 27 2006, 14:43:58) [GCC 4.0.3 (Ubuntu 4.0.3-1ubuntu5)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import model >>> i = model.entry_table.insert() >>> i.execute(id='first-post', title="Some Title", content="Some pithy text...", updated="2006-09-01T01:00:00Z") >>> i.execute(id='second-post', title="Moving On", content="Some not so pithy words...", updated="2006-09-01T01:01:00Z")
独立运行
~$ python manage.py run Serving HTTP on 0.0.0.0 port 8080 ...
SQLAlchemy官方网站
WSGI官方网站:
精巧地址:
Kid官方网站
精巧地址:
是一个完备的,全功能Web应用框架!通过极少的配置和开发,就可以完成一个动态数据展示页面!
正是因为使用Python 能够轻易的将各种即有模块组合出一个Web应用框架来;
所以,不象其它语言世界,仅仅有唯一或是极少数Web应用框架,,,
在Python 世界,有太多太多的应用框架,以致于大家被选择哪个所深深困惑! 即怕选择错框架,带来开发的麻烦;又怕一但选定了框架,将来享受不到其它框架更加美妙的特性,患得患失中,痛苦渡日;-)
这里行者们根据一些使用过的框架,综合考虑各种因素,大致的给出比较靠谱的Python Web应用框架理解来,以便帮助大家面对异常丰厚的Python Web应用框架,如何保持"平常心",正确对待各种框架;
按照笔者接触到框架的时间顺序来排列大致是这样的:
Zope->Plone->Twisted->Snakelets->->Quixote->Karrigell->->web.py->Django->->Pylons->Eurasia->Web2py->Uliweb
这里没有给出详细的开发社区情况,以及笔者体验框架的详细日期和情景,只是大致的列出先后接触/了解/应用框架的顺序;以此为基础,分享一点,对Python Web应用框架的体验:
访问地址:
精巧地址:
访问地址:
精巧地址:
进一步的,根据前述"Joe Gregorio的超级框架",可以明确一个功能完备的Web应用框架,至少应该包含以下方面的功能支持:
各种框架一般前三个方面都支持的不错,那么可以根据对第4个方面的态度大致将所有Python Web应用框架分成以下几类:
是其中经典作品;
现在,虽然可以快速理解现在所有的Py框架,但是谁无法保证不再出现新好框架;那么,如何理性的靠谱的为自个儿的应用选择一个合适的框架?
A. 项目是否需要长期运营? B. 项目是否足够复杂多变?
A | B |
|
问题状态 | 框架选择 | |
Y | Y | 平台型框架最佳 |
Y | N | 轻小性框架即可,平台型框架最佳 |
N | Y | 一站式架最佳 |
N | N | 轻小性框架最佳 |
世事无常,虽然我们反对:"手中有锤子,就将世界看作是由钉子组成的!"
所以,更多时候,用熟悉的框架,比用流行的框架要靠谱!因为Python 本质特性,是支持我们快速扩展模块,成为全新的工具!UliWeb/Eurasia 以及久远之前,停止开发的 (悟空智轮)这些原创框架,都是增补他人的框架厌烦后,产生的全新框架,也都是可以解决一定领域中的需求;
基于以上对 Python Web应用框架的体验,笔者精选出非常有代表性的框架,特邀专家,分别撰写了技术文章,在此,笔者满怀敬意的先进行小小的导读:
由中华Zope 推广第一人Jungyong Pan 亲笔撰写! 老Pan 对Zope 技术之痴迷到了职业水平,为推广Zope 技术组建了"润普科技"( 的企业信息化解决方案的实施;而且创建了 CZUG~中国Zope 用户组( 相关技术文档,为我们学习使用Zope 平台提供了丰厚的资源! 在这篇文章中,可以学习到Zope -- 这一从开始就冲着改造世界这一宏伟目标去的技术平台 -- 的基础思想和发展路线,从而树立信心,敢于跳入这一深海中;
豆瓣网() 已经成为全球流量最高的纯Python实现网站! 而使用的应用框架 ~Quxiote 却是个轻小型框架,豆瓣团队是怎么作到的呢?! 是豆瓣核心开发成员,由他撰写的介绍文章,从实际的开发体验出发道出了 Quxiote ~ 唐吉诃德,这一个性框架的本质思想和运用技法,非常难得!
访问地址:
精巧地址:
事实上沈崴作为大型IT公司的资深架构师,一直在亲手打造适合自身的应用框架! 仅仅从 Eruasia3的内部名称:Genhiskhan~ 成吉思汗 再结合本身的名称Eurasia(欧亚),就可以知道是有多么的自信和自豪了!这一切是源自 的变态能力,以及开发团队变态丰富的项目经验,再加上沈游侠变态的架构能力,最终将这一恶魔级别的框架带到了人间,大家可以从这篇流畅的短文中体验到 Eurasia 这一源自真实的大规模应用需求的高级框架的思想和个性;-)
这又是一个中国人原创应用框架,作者是Limodou,实际上笔者体验过的各种框架,都是在Limodou 的带领下逐一进行的; Limodou 长期独自在业余时间进行Python 的学习和开发,先后完成了不少作品,其中最成功和知名的就是 ( )~ 这是个纯Python 实现的编辑器,支持各种高级的辅助编程功能; 正是在丰富的开发和应用经验基础上,Limodou 逐渐发现了现有的所有Python Web应用框架,都不是完美的,都有这样那样的缺点;所以,Limodou 决定自个儿写出满足自己所有期望的好框架来,这就是 的由来! 而且 很大程度上应用了很多在桌面编辑器软件 中的开发经验,提供很多命令行的框架应用操控支持,这是其它框架所没有特性;虽然现在 还在开发中,但是已经可用,而且形成了独特的应用世界观,大家可以亲自从框架作者的简介中去感受这一世界观;-)
""" 沈崴~ 人称沈游侠,因其涉猎之广已经到了传奇的地步!比如说,虽然身为网易的资深系统架构师,但业余在作历史研究--写县志,同时尝试了音乐创作和发行,更加离谱的--还是位靠谱的投资人! 如此传奇的人物,一手打造的应用框架,也必然是传奇的! 仅仅从 Eruasia3的内部名称:Genhiskhan~ 成吉思汗 再结合本身的名称Eurasia(欧亚),就可以知道是有多么的自信和自豪了!这一切是源自 的变态能力,以及开发团队变态丰富的项目经验,再加上沈游侠变态的架构能力,最终将这一恶魔级别的框架带到了人间,大家可以从这篇流畅的短文中体验到 Eurasia 这一源自真实的大规模应用需求的高级框架的思想和个性;-) """
在进入各个框架的精彩介绍前,再来展示一下 Python 世界的奇幻:
下载地址:
精巧地址:
下载地址:
精巧地址:
一个模板实例:
from template import compile, Template s = '''\ <%def name="test2(a, b)"> ${caller.test3()} or ${context.get('test3', None)()} %if a: ${a} %elif b: ${b} %else: <%write('hello')%> %endif %for i in xrange(100): ${str(i)} %endfor %def> <%def name="test(c, d)"> <%call expr="test2(1, 2)"> <%def name="test3()"> <% x = 1 %> hello world! in test3 %def> %call> %def> ''' print compile(s) m = Template(s) print m.test('aaa', 'bbb')
Python Web应用框架纵论 :: +-- 导论 | +-- 现状 | \-- 为什么Python 中有这么多框架? +-- 分类 | +-- 如何来理解各种框架? | +-- 框架的框架 | +-- 轻型框架 | +-- 一站式框架 | \-- 模板系统 +-- 细说(按照历史顺序,选择经典框架来介绍,没有PCS独立章节的,和故事没有直接提及的) | +-- Zope/Plone (请潘俊勇撰写) | +-- Quixote (请 阿北或是朞其它豆瓣成员 撰写) | +-- Eruasia (请 沈崴 撰写) | +-- Django (HY自写) | \-- UliWeb (请Limodou撰写) +-- 选择 | +-- 个人 | +-- 团队 | \-- 企业 \-- 小结 \-- 选择的痛苦