最近2个月才有时间看看为什么类似rails的web开发方式如此吸引人,看着ruby的语法,发现有点像python,貌似现在比较新的动态语言的语法都有点类似,不过这样好处很明显:不用记很多关键字。
于是就干脆看看多年不用的python现在怎么样了,突然发现python已经升级到2.5了,我03年用的时候还在用2.3,先不管了,升级了再说,然后才发现,原来有的python web框架在07年2月份的时候居然无法在2.5上运行,比如TurboGear就是只支持到python 2.4的,不过,我很快就dump掉TurboGear了,虽然一开始是被他那个20 minutes Blog development video cast所吸引,video培训倒是比文档培训更简单有效的方式,只要有一个摄像头的机器,配上录制截屏的软件,就可以了,准备好演示脚本,并且配套使用摄像头,这方法进行团队入门培训是很有效的。除了python版本兼容问题,另一个抛弃TurboGear的原因是因为,它目前只能使用kid做html模板,这是一个严重的问题,显然不是所有的web输出都一定是xml格式的。
接下来开始看django,这是一个不知道怎么发音的匈牙利名字
,也许听起来和“丛林”差不多,尽管它有着目前世界上最完善的python web开发文档(我们先不谈Zope,因为它不是rails式的),但我依然不可能只凭文档就可以轻松的了解:如何才能复用html模板,根据uri动态替换某个区域的内容。另外,似乎django的团队试图凭自身的力量解决所有的问题,确实,在某种程度上说,他们基本上做到了,但从实际项目应用的角度来说,还是有距离的,比如,数据库连接多样性的问题,不太清楚他们的team规模有多大,单凭一己之力,full stack的框架,肯定有风险。还有静态文件分布的问题,感觉这一块很难接受,调试环境和发布环境似乎有很大的区别,看到这个问题的时候,已经对它不太有兴趣了,在这里
How to serve static files,如此草率的处理方式,简直让人瞠目。要知道,一个web应用,静态文件的位置绝不是简单的一个问题,直接关系到团队合作和开发编码的效率,也直接和客户可以提供的目录结构有关,比如客户已经有一个发布环境了,他不能再提供"/"开始的路径了,等等类似的问题。
Pylons,这是一个“粘合”起来的web框架,使用了一堆的开源包来构建整个的stack,然后使用paster,混杂在一起的效果还是可以的,避免了团队资源的问题,在开发、调试时,静态文件的问题也处理得很自然。接下来,就开始一次我理解中的,web应用的开发过程。
参考基础文档,如,
Pylons wiki sample,建立一个基本的数据库连接,html文件模板,routes的url映射,启动paster的调试服务器之后,直接就可以在http://localhost:5000/看见缺省的页面了,而这个页面实际上就在项目文件目录的public目录下,所有的相对web的根目录就在这里,我们可以把images目录,css, js等等目录都放到这里来。如果,项目中有html designer的话,这样的结构,很容易和他沟通,只要要求他使用相对目录定位这些静态文件,就可以避免程序员拿到页面模板之后再对静态文件路径做查找替换。这是一个双赢的方法,但随后的过程,我们也发现了rails模式的url灵活性,还是带来了一些副作用。
一般,在config/routing.py中,有这样一行:
map.connect(':controller/:action/:id')
这个效果和rails的url映射是一样的,比如一个这样的URI: "/syslogin/list",会使controllers/syslogin.py中的SysloginController.list方法被调用,假定:
class SysloginController(BaseController):
template_path = "/syslogin"
def index(self):
return redirect_to(action='list')
def list(self):
c.page_title = "System login list"
if self.isPostback():
loginids = request.params.getall('delloginid')
if loginids:
for lid in loginids:
login = SysLogin.get_by(loginid=lid)
login.delete()
login.flush()
# because the delete is a postback, use the re-direct can avoid the re-post action
return redirect_to(action='list')
self.logins = SysLogin.select()
return render_response(self.template_path + "/list.myt")
这里,最后一行,templates/syslogin/list.myt的html模板会被输出。
假定,list.myt是这样的内容:
<%flags>inherit="/base.myt"</%flags>
<form id="frmLoginList" name="frmLoginList" action="<%c.Controller.getURI()%>" method="post">
<div class="ButtonsBar">
<input type="button" name="btnAddNew" value="Add new" onclick="location.href='../edit/new.html'"/>
<input type="button" name="btnDelete" value="Delete" onclick="delSelected('frmLoginList', 'delloginid')"/>
</div>
<table class="datalist" cellspacing="0">
<thead>
<tr>
<td><input type="checkbox" id="chkall" name="chkall" onclick="checkall('delloginid', this.checked)"/></td>
<td>Login name</td>
<td>Email</td>
<td>Privilege</td>
<td>Valid</td>
</tr>
</thead>
<tbody>
% for login in c.Controller.logins:
<tr>
<td><input type="checkbox" name="delloginid" value="<%login.loginid%>" onclick="vcheck('chkall', this.checked)"/></td>
<td><a class="std" href="../edit/<%login.loginid%>"><% login.loginname %></a></td>
<td><% login.email %></td>
<td><% login.transPrivilege() %></td>
<td><% login.transValid() %></td>
</tr>
%
</tbody>
</table>
</form>
<img src="../images/background.gif" alt="bach ground pic"/>
<script type="text/javascript" src="../js/common.js"></script>
注意最后2行引用的静态文件,当还有另一个URI: "/syslogin/list/"时,浏览器将使用这最后的一个"/"来计算引用的资源,这时,使用相对路径的假定被破坏了,这些资源的引用将是错误的多了一个层次,也就是浏览器实际将请求/syslogin/images/background.gif,而不是/images/background.gif。这样的问题在/syslogin/edit/:id这样的请求时特别明显。
一般的web服务器,如果遇到/syslogin/list这样的URI时,是先查找list这个文件的,如果没有文件,就找这个名字的目录,如果目录可以列表就直接返回文件列表,如果不可以列表,但定义了缺省响应文件,例如:index.html之类的,就返回这个文件的内容,但routes的url映射没有很严格的定义这样的行为,实际上只有一个index方法来处理这样的URI:/syslogin/list/,我仍然没有找到可以非常简单的配置项,就可以使/syslogin/list这样的URI重定向到/syslogin/list/的方法,好像除了在list方法中写字符串判断以外没有其他方法了。顺便看了一个javaeye的URL映射,问题是一样的,他们也没有处理,当访问
http://onlypython.group.iteye.com/group/blog
或
http://onlypython.group.iteye.com/group/blog/
时,只是简单的返回了一个404而已,这也算一个解决的办法,只是不够完美。
分享到:
相关推荐
In this book, cofounder and lead developer James Gardner brings you a comprehensive introduction to Pylons, the web framework that uses the best of Ruby, Python, and Perl and the emerging WSGI ...
The Definitive Guide to Pylons.pdf
主要介绍了Python Web框架Pylons中使用MongoDB 的例子,大家参考使用
pyramid是最新python web开发框架,pylons升级版。
python库,解压后可用。 资源全名:Pylons-0.8.2-py2.3.egg
资源来自pypi官网。 资源全名:Pylons-0.8.2-py2.3.egg
塔架 Pylons是一个快速的Web应用程序开发框架。 笔记定向塔已与repoze.bfg合并,并且现在处于仅维护模式。 强烈建议新项目从新的合并的Web框架。安装。 如果要从源代码安装,可以运行以下命令: $ python setup.py ...
Apress.the.Definitive.Guide.to.Pylons.Dec.2008
(3)the pylons (or towers) supporting the cable system; (4)the anchor blocks (or anchor piers) supporting the cable system vertically and horizontally, or only vertically, at the extreme ends.
pyramid1.2源码安装包。pyramid是最新python web 开发框架。是pylons的升级版。
博文链接:https://zsp.iteye.com/blog/178446
可用于UnityVR开发,3D游戏开发,高清天空盒子Skybox素材,游戏环境背景素材,无水印。 让你身临其境的天空盒子,各类题材丰富,都是辛苦搜罗所得的高清exr格式,可以直接用于Unity开发,特别是VR游戏的开发。...
1.简介 celery(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。 celery用于生产系统...celery是易于集成Django, Pylons and Flask,使用 django-celery, celery-pyl
Web Server:JCR使用Pylons内建的Web server,不需要其他Server。 依赖的软件: Python 2.4 or later (2.5+ recommended) Pysqlite(DB-API 2.0 interface for SQLite databases) Setuptools Pysvn 注意:下载...
基于Pylons Web框架的简单SVN服务器管理工具。
Native Python API with Django and Pylons support Native Ruby API with Rails/Rack support Scalable, fast and easy to distribute behind a proxy Based on Twisted Multi-application and dual ...
它建立在许多免费软件项目之上,例如Pylons Web框架,Solr搜索平台,Memcached,Redis,许多Python库等。 正在安装 Adhocracy可以在Linux系统(例如Debian Squeeze)上运行。 它可能在FreeBSD或OS X上运行,但是最近...