为什么想学习pylons?
打算写一个抓新闻的网站,可以把那些新闻打包为纯文本,下载到pda上慢慢看.
行事先利其器,先选一个框架.
以前用了一段时间的Django,觉得它的自动化程度比较高,很适合快速开发,但是有利就有弊,相对而言,我觉得其不足有:
1.其ORM对于一些简单的应用还是不错,但是对于多表的操作就没有sqlalchemy优雅.
2.模板和代码完全分离从出发点看来是不错,但是这样做带来的缺点就
a.编写麻烦
b.会有许多琐碎的自定义标签
此外,对于我这种页面和代码统统负责的孤家寡人来说有点画蛇添足
我的观点是,总有许多一次性的代码,把这些代码扔进页面是不错的选择.
听说mako效率不错,想看看
3.newform有种鸡肋的感觉
4.文件上传集成到Model中的做法不是很灵活
5.url映射不够智能,太繁琐
等等
于是,去看看pylons,听说它是自由度比较高.
我先从svn中checkout出pylons的源代码,安装,如同python的安装惯例
setup.py install
然后又去checkout出sqlalchemy和mako的代码装上(追新族:),方法类似.(mako好像自带了,可以不装,不过不是最新版)
我列举一下svn地址,以便安装
pylons
http://pylonshq.com/svn/Pylons/trunk
mako
http://svn.makotemplates.org/mako/trunk
sqlalchemy
http://svn.sqlalchemy.org/sqlalchemy/trunk
然后将python安装路径下的Scripts目录加入系统的PATH环境变量,正式开工.
先创建项目,在命令行下切换到一个合适的路径,执行如下的命令,其中shot_net为项目名,可以自己取.
paster create --template=pylons shot_net
它会自动的创建一个项目的目录,我们cd进入该目录,执行
paster serve --reload development.ini
启动它自带的服务器,命令行中会告诉你端口,可以到development.ini中修改(如下),我修改为19809.
[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 19809
现在访问那个端口,可以看到这个网页
"Welcome to your Pylons Web Application"
可以看到其下当前路径下有一个与项目同名的目录,我们进入该目录下的public目录。
public目录是用来查找静态文件的。
新建一个index.html文件替换原来那个,刷新,ok,可以看到我们自己的index.html文件了。
也可以通过
http://127.0.0.1:19809/index.html
访问
然后类似下面,创建一个controller
D:\myWay\project\shot_net\shot_net>paster controller get_html
Creating D:\myWay\project\shot_net\shot_net\controllers\get_html.py
Creating D:\myWay\project\shot_net\shot_net\tests\functional\test_get_html.py
现在访问
http://127.0.0.1:19809/get_html/
就可以看到
Hello World
这个路径是自动映射的,真不错:)
然后修改shot_net/config/routing.py中的make_map,加上这么一句,注意要加在其他的connect之前
map.connect('', controller='get_html', action='index')
删除那个index.html,现在http://127.0.0.1:19809/也可以看到Hello World了.
然后照搬教程,在GetHtmlController类中添加如下的函数
这个函数中的c是用来向模板传递变量的东西,满hacker的:)
def serverinfo(self):
import cgi
import pprint
c.pretty_environ = cgi.escape(pprint.pformat(request.environ))
c.name = 'The Black Knight'
return render('/serverinfo.mako')
到templates目录下新建一个serverinfo.mako模板(我统一用utf-8编码,不加BOM)
<h2>
Server info for ${request.host}
</h2>
<p>
The URL you called: ${h.url_for()}
</p>
<p>
The name you set: ${c.name}
</p>
<p>The WSGI environ:<br />
<pre>${c.pretty_environ}</pre>
</p>
访问
http://127.0.0.1:19809/get_html/serverinfo
OK,可以看到一堆信息.
仔细看看,有意思的有
'HTTP_ACCEPT_ENCODING': 'gzip,deflate',
表明网页是被压缩了的,自带这个功能,不错不错:)
OK,先看这么多.我去写一个页面模板.